android - 通知点击显示当前 activity,如果应用已关闭则启动新的 activity

android - notification click shows current activity, if app is closed start new activity

我有一个带有服务和持续通知以及两个活动的应用程序:

Activity AActivity B

Activity A 有一个按钮开始 Activity B.

单击通知时,我希望发生以下情况:

  1. 如果应用关闭 -> 使用 Activity A 启动应用。
  2. 如果应用程序在前台或后台(打开的应用程序列表)打开 activity -> 显示当前 activity 而不启动新的 Activity A,这意味着如果我在 Activity B -> show current Activity BActivity A 相同,但没有启动新的。

找了很多终于找到这个answer,说你需要做的:

final Intent notificationIntent = new Intent(context, ActivityA.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

清单中我有:

注意我用了android:launchMode="singleTop".

    <activity
        android:name=".ActivityA"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar"></activity>
    <activity
        android:name=".ActivityB"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:theme="@style/AppTheme.NoActionBar"></activity>

似乎工作一致性不够,如果执行以下操作,则永远不会工作:启动应用程序->启动activity A->启动服务(显示通知)->转到Activity B -> 点击通知打开 Activity A

我想知道是否有更好的一致性解决方案:

当然它总是会打开 ActivityA 因为你在这里定义了它:

final Intent notificationIntent = new Intent(context, ActivityA.class);

你需要做的是定义你最后的位置。 这是我的处理方式:

Make a class and extend it from Application class

在这里定义一个变量,可以是boolean, enum, int 等等... 当您输入任何这些活动时,请更改该参数。

in OnDestroy of each activity reset that particular variable to its default value.

In your service before making the intent, check which state you were at last and make your intent based on that.

public class MY_APPLCIATION extends Application {
    public static Boolean ActivityAIsRunning=false;
    public static Boolean ActivityBIsRunning=false;
}

覆盖两个活动的 onResume 和 onDestroy :

public class ActivityA extends AppCompatActivity {
    // ......
     @Override
protected void onDestroy() {
    super.onDestroy();
    MY_APPLCIATION.ActivityAIsRunning=false;
}

@Override
protected void onResume() {
    super.onResume();
    MY_APPLCIATION.ActivityAIsRunning=true;
}
}

活动B:

public class ActivityB extends AppCompatActivity {
    // ......
     @Override
protected void onDestroy() {
    super.onDestroy();
    MY_APPLCIATION.ActivityBIsRunning=false;
}

@Override
protected void onResume() {
    super.onResume();
    MY_APPLCIATION.ActivityBIsRunning=true;
}
}

现在有个技巧你要注意了:

You should define the intent when you are creating the notification !

你应该有另一个 activity(我们称它为 MY_NOTIFICATION_ACTIVITY)。 并且通知应始终转到此 activity。 现在在 activity 检查设置了哪个布尔值,然后调用所需的 activity (ActivityA 或 ActivityB)。不要忘记,在您的清单中,您也应该将 ActivityB 设置为 singleInstance!!!

*** ANOTHER SIMPLE METHOD

另一个简单的方法是在每个 activity 的 OnResume 中更新通知。 通过输入每个 activity 您将意图更改为所需的 activity 并发出相同的通知并更新最后一个通知。