我的应用程序包含服务和持续通知以及两项活动:
Activity A
和Activity B
。
Activity A
有一个启动Activity B
的按钮。
点击通知时,我希望下一个场景发生:
Activity A
启动应用。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
。
我想知道是否有更好的一致性解决方案:
答案 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中的通知。 通过输入每个活动,您可以将意图更改为所需活动并发出相同的通知并更新上一个通知。