如何将同一个APP中的不同activity在Recent(最近任务)中显示?
来源:互联网 发布:java大学基础教程 pdf 编辑:程序博客网 时间:2024/05/21 08:09
需求描述
在应用Application1中存在A、B两个activity,当在应用启动了A、B activity,点击Recent键,如何让A、B两个activity都显示在Recent界面(最近任务)?
需求分析
根据Android SDK介绍,Recent中是管理最近的任务(Task);熟悉Activity的可以知道Activity是隶属于某个Task的,不熟悉Activity的可以阅读下面的帖子:
http://blog.csdn.net/ff20081528/article/details/17219951#comments
那么了解了Activity的一些知识后,我们就可以推断出要让A、B在Recent中显示出来,必须将A、B处于不同的Task中;那么需要设置A、B的launchMode为singleInstance;
跟”singleTask”一样.除了系统不能再启动其它activity到拥有这个activity实例的任务中.activity永远是任务的唯一;任何由这个activity启动的其它activity都在另一个任务中打开.也就可以说singleInstance必然会开辟出一个新的Task。
Demo示例
MainActivity.java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btn1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn1 = (Button) findViewById(R.id.button); btn1.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button: Intent intent1 = new Intent(this,ActivityA.class); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent1); break; } }}
ActivityA,java
public class ActivityA extends AppCompatActivity { Button btn2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); btn2 = (Button) findViewById(R.id.button2); btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent2; intent2 = new Intent(ActivityA.this,ActivityB.class); startActivity(intent2); } }); }}
Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="lanchmode.sunrise.com.lanchmode"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActivityA" android:label="@string/title_activity_activity" android:launchMode="singleInstance" android:theme="@style/AppTheme.NoActionBar" /> <activity android:name=".ActivityB" android:label="@string/title_activity_b" android:launchMode="singleInstance" android:theme="@style/AppTheme.NoActionBar" /> </application></manifest>
运行程序,然后使用adb shell dumpsys activity activities命令查看activity的栈的信息:
Running activities (most recent first): TaskRecord{b1c230d #265 A=lanchmode.sunrise.com.lanchmode U=0 StackId=1 sz=1} Run #3: ActivityRecord{638abae u0 lanchmode.sunrise.com.lanchmode/.ActivityB t265} TaskRecord{7b648d3 #264 A=lanchmode.sunrise.com.lanchmode U=0 StackId=1 sz=1} Run #2: ActivityRecord{65e4f8b u0 lanchmode.sunrise.com.lanchmode/.ActivityA t264} TaskRecord{8ff7c10 #263 A=lanchmode.sunrise.com.lanchmode U=0 StackId=1 sz=1} Run #1: ActivityRecord{5a771a1 u0 lanchmode.sunrise.com.lanchmode/.MainActivity t263}
可以看出A、B及主activity都处于不同的Task中,那么我们点击Recent看下,是否已经实现了我们需求了呢:
结果很是失望,只有最后启动的B在最近任务中。
需求出现问题解决
不同的Activity已经处于不同的Task了,为什么还是在最近任务中没有分别显示呢?是因为在同一个应用中(但是Recent的描述就是管理最近任务,任务就是Task啊)?通过查看activity的属性,发现了taskAffinity这个属性;
- taskAffinity表示当前activity具有亲和力的一个任务(翻译不是很准确,原句为The task that the activity has an affinity for.),大致可以这样理解,这个 taskAffinity表示一个任务,这个任务就是当前activity所在的任务。
在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务。
一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity。
这个属性决定两件事:当activity被re-parent时,它可以被re-paren哪个任务中;当activity以FLAG_ACTIVITY_NEW_TASK标志启动时,它会被启动到哪个任务中。(这个比较 难以理解,请结合中的属性allowTaskReparenting和Intent中的标志 FLAG_ACTIVITY_NEW_TASK加以理解)
默认情况下,一个应用中的所有activity具有相同的taskAffinity,即应用程序的包名。我们可以通过设置不同的taskAffinity属性给应用中的activity分组,也可以把不同的 应用中的activity的taskAffinity设置成相同的值。
为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task。
那么就是就使用taskAffinity设置A、B的亲和力:
<activity android:name=".ActivityA" android:label="@string/title_activity_activity" android:launchMode="singleInstance" android:taskAffinity="com.sunrise.A" android:theme="@style/AppTheme.NoActionBar" /> <activity android:name=".ActivityB" android:label="@string/title_activity_b" android:taskAffinity="com.sunrise.B" android:launchMode="singleInstance" android:theme="@style/AppTheme.NoActionBar" />
然后再运行程序,首先查看栈情况:
Running activities (most recent first):
TaskRecord{b1c230d #265 A=lanchmode.sunrise.com.lanchmode U=0 StackId=1 sz=1}
Run #3: ActivityRecord{638abae u0 lanchmode.sunrise.com.lanchmode/.ActivityB t265}
TaskRecord{7b648d3 #264 A=lanchmode.sunrise.com.lanchmode U=0 StackId=1 sz=1}
Run #2: ActivityRecord{65e4f8b u0 lanchmode.sunrise.com.lanchmode/.ActivityA t264}
TaskRecord{8ff7c10 #263 A=lanchmode.sunrise.com.lanchmode U=0 StackId=1 sz=1}
Run #1: ActivityRecord{5a771a1 u0 lanchmode.sunrise.com.lanchmode/.MainActivity t263}
栈的情况没有变化,然后再点击Recent,运行如下图
结果是OK了!!!
总结
如果需要将同一个APP的不同Activity在Recent中显示,需满足如下两点:
- LaunchMode设置为singleInstance。
- 设置android:taskAffinity参数。
- 如何将同一个APP中的不同activity在Recent(最近任务)中显示?
- 如何在Recent App不显示某个应用
- Arcgis---将坐标不同的图层显示在同一个ArcScene中
- ideal中如何添加几个不同的项目在同一个idea的显示页面
- Qt 在同一个QLabel中实现不同样式的显示
- Qt 在同一个QLabel中实现不同样式的显示
- 多个fragment在同一个activity中显示
- 【Android】在Recent列表中隐藏App
- Android 在同一个Activity使用不同layout
- 同一个应用程序的不同Activity可以运行在不同的进程中么?
- 同一个activity中不同fragment的跳转
- Android学习——如何将Fragment添加到Activity,并且在Activity中显示
- Android中如何让一个Activity不出现在recent列表里
- Activity A启动Activity B,在B中按Home回到主屏幕,按menu时呈现后台app任务列表,如何让刚退出的app的界面显示为A,而不是退出时的B
- 将一个Activity放到系统的最近任务列表里,独立于宿主app任务卡之外
- Android同一个xml布局文件在不同中显示效果不同
- 隐藏app图标并不在最近运行中显示
- ASP.NET MVC 中 如何将同一个form post到不同的action
- xxxx
- 线上应用故障排查之一:高CPU占用
- 不用CSS3的弹性盒模型实现双飞翼布局
- 如何理解卷积神经网络中的权值共享
- spark sql 中 java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.Gener
- 如何将同一个APP中的不同activity在Recent(最近任务)中显示?
- 两种常用方法使用JS动态添加事件
- 你真的了解WIFI吗?
- Jenkins 集成Egret发布代码
- AV Foundation学习之补充(二)
- 有趣的浏览器发展史
- 怎么提升个人的代码编写能力
- Redis配置文件解析
- Android给布局设置阴影