特點
棧頂複用模式
應用場景
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"));
}
}