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

时间:2016-06-04 15:49:48

标签: android android-intent android-activity android-service android-notifications

我的应用程序包含服务和持续通知以及两项活动:

Activity AActivity B

Activity A有一个启动Activity B的按钮。

点击通知时,我希望下一个场景发生:

  1. 如果应用关闭 - >使用Activity A启动应用。
  2. 如果在任一活动中在前台或后台(已打开的应用列表)中打开应用,请执行以下操作:>显示当前活动而不启动新的Activity A,这意味着如果我在Activity B - >显示当前Activity B并且Activity A相同而不启动新的。{/ li>

    我搜索了很多,最后找到了这个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>
    

    它似乎没有足够的一致性,如果执行以下操作它永远不会起作用:start app - &gt;开始activity A - &gt;启动服务(显示通知) - &gt;转到Activity B - &gt;点击通知会打开Activity A

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

1 个答案:

答案 0 :(得分:2)

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

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

您需要做的是定义最后的位置。 这是我如何处理这个:

  

创建一个类并从Application类

扩展它

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

  

在每个活动的OnDestroy中将该特定变量重置为其默认值。

     

在制作意图之前的服务中,检查你最后的状态,并根据它做出你的意图。

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;
}
}

ActivityB:

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;
}
}

现在有一个你应该注意的技巧:

  

您应该在创建通知时定义意图!

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

  

***另一种简单的方法

另一个简单的方法是更新每个活动的OnResume中的通知。 通过输入每个活动,您可以将意图更改为所需活动并发出相同的通知并更新上一个通知。