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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章