转载: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"));
}
}
网友评论