第二十四章 深入学习 intent 和任务
- 由于不能使用隐式Intent
通过PackageManager
查询符合相关inten
t的信息
Intent startupIntent = new Intent(Intent.ACTION_MAIN);
startupIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager pm = getActivity().getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(startupIntent, 0);
ResolveInfo
包含了各种信息, 如:activityInfo, serviceInfo, providerInfo等.- 启动相关
Intent
public void onClick(View v) {
ActivityInfo activityInfo = mResolveInfo.activityInfo;
Intent i= new Intent(Intent.ACTION_MAIN)
.setClassName(activityInfo.applicationInfo.packageName,
activityInfo.name)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
- 通过
PackagerManager
获取应用名和图标(AndroidManifest
文件中的label
和Icon
)
String appName = mResolveInfo.loadLabel(pm).toString();
Drawable mImage = mResolveInfo.loadIcon(pm);
任务
- 每个概览屏的应用即为一个任务.
- 为了在新任务中启动新的activity. 在发送的Intent后加上
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- 每个进程可以有相同activity名的不同实例, 但都对应着不同的任务中的activity
![任务与进程](https://i-blog.csdnimg.cn/blog_migrate/e5e0496a5577e751946f85299f704df2.jpeg)
并发文档
- 在Lollipop设备及以后, 可以为同一应用启动多个任务(如: wps 可以同时打开多个文档进行编辑)
有以下两种方法
.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
- 在AndroidManifest文件的
activity
中加上documentLaunchMode
,如: android:documentLaunchMode="intoExisting"
- 一份文档只会对应一个任务, 但如果想创建相同任务, 就要同时打上
.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
与.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
的标签 或设置 android:documentLaunchMode="always"
- 想深入了解概览屏, 可以看
guide/components/recents
相关小记
- 使用
startActivity
或startActivityForResult
方法启动隐式Intent
时, 系统会自动给Intent加上DEFAULT
属性. 这样会无法保证匹配, 故这里转而使用显示Intent
, 通过setClassName
去寻找匹配项
Collections.sort(activities, new Comparator<ResolveInfo>() {
@Override
public int compare(ResolveInfo o1, ResolveInfo o2) {
PackageManager pm = getActivity().getPackageManager();
return String.CASE_INSENSITIVE_ORDER.compare(
o1.loadLabel(pm).toString(),
o2.loadLabel(pm).toString()
);
}
});
挑战练习
- 为应用加上图标
在holder的bindActivity中加上Drawable mImage = mResolveInfo.loadIcon(pm);