Android权威编程指南笔记 第二十四章 深入学习 intent 和任务

第二十四章 深入学习 intent 和任务

  • 由于不能使用隐式Intent
    通过PackageManager查询符合相关intent的信息
        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;
//          setClass使用显式应用程序 包名和类名 创建组件名,达到setComponent的目的,也可以自己创建ComponentName
            Intent i= new Intent(Intent.ACTION_MAIN)
                    .setClassName(activityInfo.applicationInfo.packageName,
                            activityInfo.name)
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            startActivity(i);
        }
  • 通过PackagerManager获取应用名和图标(AndroidManifest文件中的labelIcon)
            String appName = mResolveInfo.loadLabel(pm).toString();
            Drawable mImage = mResolveInfo.loadIcon(pm);

任务

  • 每个概览屏的应用即为一个任务.
  • 为了在新任务中启动新的activity. 在发送的Intent后加上.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  • 每个进程可以有相同activity名的不同实例, 但都对应着不同的任务中的activity任务与进程

并发文档

  • 在Lollipop设备及以后, 可以为同一应用启动多个任务(如: wps 可以同时打开多个文档进行编辑)
    有以下两种方法
  1. .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
  2. 在AndroidManifest文件的activity中加上documentLaunchMode,如: android:documentLaunchMode="intoExisting"
  • 一份文档只会对应一个任务, 但如果想创建相同任务, 就要同时打上 .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT).addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)的标签 或设置 android:documentLaunchMode="always"
  • 想深入了解概览屏, 可以看guide/components/recents

相关小记

  • 使用startActivitystartActivityForResult方法启动隐式Intent时, 系统会自动给Intent加上DEFAULT属性. 这样会无法保证匹配, 故这里转而使用显示Intent, 通过setClassName去寻找匹配项
  • 对activity的标签按字母顺序进行排序
        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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值