Bootstrap

Notification点击跳转指定界面(APP被杀死或双击退出时唤醒,然后跳转)

现有如下需求:
后台做一个推送,APP收到后以notification的形式展示,用户点击,跳转到指定界面。

需求简单,但是有些细节,确是要在写的时候,通过大量测试才能知道。
1、如果用户双击退出了,这个时候,APP并没有被系统杀死,点击手机上的菜单键,可以看到它还在系统中存活着,这个时候,如果点击notification去跳转指定界面(如:Activity1),会直接打开,但是用户点击返回键的时候,会立刻结束这个Activity,回到手机桌面。
2、如果用户在APP被清理、杀死的情况下收到推送,展示了一个notification(用三方的可以做到这样),这个时候用户点击,会唤醒APP,但是最后停到APP首页,并没有去指定界面。

经过测试今日头条美团的notification消息(有了推送不立刻点,调整到我想要的状态再去点击),模拟的写了个处理方法,最后效果差不多

要跳转的界面,肯定不止一个,暂定3个Activity,1-3,创建一个bean,创建跳转工具类等进行操作。

特别注意!
特别注意!
特别注意!
本来这个说明,计划写在最后,不过担心看到下面就没耐心了,就提前到前面!
说明:
注意清单文件中,唤醒中转界面:AwakeTempActivity的启动模式,是android:launchMode=”singleTask”。不要用默认的。
经大量测试发现,以下情况,点通知栏不会跳转,需要这样设置AwakeTempActivity的启动模式才能解决
1、(此方法复现率100%)启动APP,双击退出(不要杀死),后台推送2条(及以上),手机上点击其中一条,APP被唤醒并去到指定界面,然后点击其他通知,不会跳转;
2、(此方法复现率很高)启动APP,双击退出(不要杀死),后台推送,手机收到后,启动APP,APP稳定到首页后,点击收到的推送,此时不会跳转到指定界面

其他:
目前我知道的,有5种方法可以唤醒指定APP:h5唤醒,需要清单文件中做一定的配置,这个我在前面博客中写过,不多说了;广播(如果用notification,因为有PendingIntent,发广播貌似效果不好(我没测试错误的话))。剩下的3种,在AwakeTempActivity中都提到了。需要注意的是,第二种方法,需要清单文件中做一些设置,配合使用(详见注释以及下面代码)。其他的不用。

目录结构:
这里写图片描述

说明:
Activity1-3,是要去的目标页面,其中,Activity_2特殊,在那个界面,就算收到消息,也不做提示和展示,用于模拟特殊界面

代码实现:
Activity1-3,是测试的,不做多余操作。他们3个的代码一样

package com.chen.demo2;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class Activity_1 extends Activity {
   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

}

MyApplication

package com.chen.demo2;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;


public class MyApplication extends Application {
   

    private Activity app_activity = null;

    private static MyApplication mContext = null;

    @Override
    public void onCreate() {
        super.onCreate();

        mContext=this;

        initGlobeActivity();

    }

    /**
     * 获取栈顶Activity
     */
    private void initGlobeActivity() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }

            @Override
            public void onActivityStarted(Activity activity) {
            }

            @Override
            public void onActivityResumed(Activity activity) {
                app_activity = activity;

            }

            @Override
            public void onActivityPaused(Activity activity) {
            }

            @Override
            

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;