singleTop模式应用场景 以及OnNewIntent

特点

 栈顶复用模式

应用场景

1、消息推送界面。

如果当前停留在消息详情界面A,突然来推送消息了,点击推送消息,又创建了一个详情界面A,按返回键back,用户会发现,点击了返回怎么还是停留在这个详情界面A呢,这样造成视觉差异

2、网易新闻。

假设主界面为 MainActivity,显示新闻的界面是 DetailActivity,显然显示任何一条新闻都会使用 DetailActivity,即把新闻内容通过 Intent 传给 DetailActivity 就可以了。 假设你正在看新闻1(即在 DetailActivity),此时手机收到服务器的推送:收到一条通知(新闻2),点击通知就会跳转到 DetailActivity 并显示新闻2,当你点击通知时,因为目前栈顶的 Activity 就是 DetailActivity,因此这里就是使用 SingleTop 的地方,即点击通知后以 SingleTop 加载模式打开 DetailActivity 并显示新闻2,因此新闻1的 DetailActivity 就被覆盖掉了。 此后你点击返回键会回到主界面。

OnNewIntent

针对网易新闻这个案例来看,DetailActivity一般是一个webView,然后 根据上一个页面(新闻列表)传过来的url展示对应的网页,“通知“也是一样的。都是通过intent把url传到DetailActivity。以下一段代码简单的模拟DetailActivity 接收数据的过程。

1、第一个页面

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                NotificationManager manager;
                Intent intent = new Intent(MainActivity.this,DetailActivity.class);
                //通知传递的数据
                intent.putExtra("name","Notification");
                PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,
                        0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
                manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification.Builder  builder = new Notification.Builder(MainActivity.this);
                builder.setTicker("您有一条新消息")//要有,不然只会发一个通知,不会弹出消息提示你,即Notification在状态栏的提示文本
                        .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND)//设置默认值如LED灯,音乐,颜色,震动等
                        .setContentText("您的订单已被接收,请耐心等待...")//要有,不然没内容
                        //这行代码的作用就是当点击该通知时,把该通知自动清除掉,不设置的话,点击不会自动清除,必须得点击手机通知栏里的清除按钮才能清除
                        .setAutoCancel(true)
                        .setSmallIcon(R.drawable.cloud)//必须要有,不然点击没反应
                        .setContentTitle("张三")//要有,不然只有内容没有标题
                        .setContentIntent(pendingIntent);//设置点击通知后将要跳转到的目的程序
                Notification notification = builder.getNotification();
                manager.notify(1,notification);


                Intent intent2 = new Intent(MainActivity.this,DetailActivity.class);
                //非通知情况下传递数据
                intent2.putExtra("name","yuzhiyun");
                startActivity(intent2);


            }
        });

2、跳转后页面

package com.yuzhiyun.learn.singletop;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class DetailActivity extends AppCompatActivity {

    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        textView = (TextView) findViewById(R.id.tv_intent);
        dealIntent();
    }

    /**
     * 当启动模式为singletop的,第二次打开这个activity的时候,就不再onCreate(),而是走onNewIntent(),这样才能获取到新的数据
     * @param intent
     */
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        //必须设置新的intent
        setIntent(intent);
        Log.i("onNewIntent","onNewIntent");
        dealIntent();

    }

    private void dealIntent() {
        textView.setText(getIntent().getStringExtra("name"));
    }
}
发布了176 篇原创文章 · 获赞 28 · 访问量 22万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章