leo*_*s79 5 stack android android-activity
有什么更好的方法来检查活动是否仍在堆栈中以便回调?
Intent i = new Intent(getApplicationContext(),MyClass.class);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
我很惊讶这个(类)问题是多么不受欢迎。
首先让我从解决方案开始:
由于ActivityManager.getRunningTasks自 API 21以来已被弃用,
我们必须找到另一种方法来获取后台堆栈中的活动。我意识到我们实际上可以实现我们自己的“堆栈”!
我在 MyOwnApplication 中声明了一个 ArrayList:
private ArrayList<Class> runningActivities = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
并添加了公共方法来访问和修改此列表:
public void addThisActivityToRunningActivityies (Class cls) {
if (!runningActivities.contains(cls)) runningActivities.add(cls);
}
public void removeThisActivityFromRunningActivities (Class cls) {
if (runningActivities.contains(cls)) runningActivities.remove(cls);
}
public boolean isActivityInBackStack (Class cls) {
return runningActivities.contains(cls);
}
Run Code Online (Sandbox Code Playgroud)
在BaseActivity所有活动都扩展它的地方:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyOwnApplication)getApplication()).addThisActivityToRunningActivityies(this.getClass());
}
@Override
protected void onDestroy() {
super.onDestroy();
((MyOwnApplication)getApplication()).removeThisActivityFromRunningActivities(this.getClass());
}
Run Code Online (Sandbox Code Playgroud)
然后你可以很容易地使用isActivityInBackStack来检查。
为什么这是必要的?
是的,当然,大多数情况可以通过使用意图标志和适当的导航来完成。
但是有这样一个用例,我认为应该很常见,我不能简单地通过使用意图标志找到解决方案。
假设我有一个应用程序,几乎在每个活动中都有一个导航抽屉。
我从 导航MainActivity到ActivityA,然后ChildActivityB从ActivityA. 请注意,ActivityA不是ChildActivityB因为ChildActivityB可以从其他活动(例如通知)打开的父级。
注意,ChildActivityB还有一个抽屉。我可以ActivityA通过抽屉导航到,而不是按向上或后退按钮。现在,假设您循环执行这样的过程:Activity A -> ChildActivity B -> Drawer -> Activity A -> ChildActivityB -> Drawer -> Activity A ..... 无限活动将在后台创建。
为了修复这种行为,我们需要使用 Intent Flags:
(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。但是,我使用overridePendingTransition(). 我注意到如果我把上面的意图标志放在一起overridePendingTransition(),动画会出现故障,因为活动在动画中间被破坏,由于标志Intent.FLAG_ACTIVITY_CLEAR_TOP。
现在,如果我能够检测是否ActivityA在 backstack 中,则行为将是完美的:
private void navigateToDrawerItems(Class cls) {
drawerLayout.closeDrawer(GravityCompat.END);
Intent intent = new Intent(this, cls);
if (((MyOwnApplication)getApplication()).isActivityInBackStack(cls)) {
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
} else {
startActivity(intent);
overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out);
}
}
Run Code Online (Sandbox Code Playgroud)
ben*_*n75 -1
查看ActivityManager API
要获取 ActivityManager 的实例,请使用以下代码:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7400 次 |
| 最近记录: |