解析 Intent(二)

前一节利用 PackageManager 查询系统所以有 Main 的 Activity,显示实现点击后进入各应用,创建显式 Intent 进行打开。

  1. 创建监听器
  2. ResolveInfo 对象获取 activity 的包名与类名 。从 ResolveInfo 对象的 ActivityInfo 中获取
1
2
3
4
5
6
7
8
9
10
11
@Override
public void onClick(View view) {
// 从 ResolveInfo 获取包名或类名
ActivityInfo activityInfo=mResolveInfo.activityInfo;
// 创建 Intent 对象
Intent i=new Intent(Intent.ACTION_MAIN)
.setClassName(activityInfo.applicationInfo.packageName,activityInfo.name);
// 启动 Intent
startActivity(i);
}

任务与后退栈

任务:通俗讲就是用户关心的 activity栈,当我们点击打开一个应用就将主 activity弹到栈顶,用户看到的是栈顶,当我们点击后退键,回到系统主屏幕

通过几个场景理解任务与栈

场景1:我们点开应用在应用中点击启动不同的 activity 返回键总是能返回到我们上一个页面,这就是 activity 栈

场景2:任务键的切换,玩过 Android 的用过

场景3:可能会想到底要说什么 o(╥﹏╥)o 说明这个自动其他应用的任务与栈与其他的不同:当我们在这个应用点击其他应用,应该会两个任务事实上当启动其他的 activity栈 添加到了自己的任务中

如果我们需要在启动新任务的 activity ,可以让应用拥有自己的任务,用户可以在运行的应用间自由切换,需要给 Intent 添加一个标志,作用是告诉系统我要让启动的activity 创建一个任务

1
2
3
Intent i=new Intent(Intent.ACTION_MAIN)
.setClassName(activityInfo.applicationInfo.packageName,activityInfo.name)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

让 NerdLauncher 应用 作为设备主屏幕

这好比 是吧这个应用设置为主屏幕,其他应用返回的 栈底部 activty ,一般设置为主屏幕的为主题应用。

现在你的手机主题 就是这个应用了。如果不小心设置了可以点击 Setting 应用——> Apps——> 选择这个应用请出默认 ——> 点击主屏幕 选择系统,然后删除该应用

获取各个应用的图标

ResolveInfo.loadLabel() 方法获取各个 activity 名称,ResolveInfo还提供 loadIcon() 的方法,为每个应用加载显示图标

  1. 创建布局模板 list_item (一个视图一个文本)
  2. ViewHolder 使用这个布局加载
  3. 实例化两个控件
  4. 包名前面通过 loadLabel() 方法获取 现在通过 loadIcon() 获取图标

这个很简单就不上代码了。

本应用 GtiHub 地址:NerdLauncher 应用