解析 Intent

应用获取设备上的可启动应用,会使用 PackageManager 获取所有可启动主 activity。你可能会发现每一个应用都有一个主启动 activity 在注册清单上都有如下

1
2
3
4
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

新增 setupAdapter() 方法 负责隐式 intent 并从 PackageManager 那里获取匹配它的所有 activity

1
2
3
4
5
6
7
8
9
10
11
private void setupAdapter() {
// 创建一个隐式 Intent 添加分类选择
Intent startupIntent = new Intent(Intent.ACTION_MAIN);
startupIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager pm = getActivity().getPackageManager();
// 利用 pm 查询所有 startupIntent 的 activity 返回给 list 列表
List<ResolveInfo> activities = pm.queryIntentActivities(startupIntent, 0);
// log 打印含有多少个 activities
Log.i(TAG, "activities have :"+activities.size());
}

通过 ResolveInfo 对象中,可以获取 activity, ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的< intent>标签收集到的信息。

我们通过 log 可以看到我们获取的 activity 现在我们完善 RecyclerView 实现数据与视图的绑定

ViewHolder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*ViewHolder 内部类显示标签名*/
private class ActivityHolder extends RecyclerView.ViewHolder {
// 创建引用信息加载获取用户标签
// 初始化显示控件
private ResolveInfo mResolveInfo;
private TextView mNameTextView;
public ActivityHolder(View itemView) {
super(itemView);
mNameTextView = (TextView) itemView;
}
public void bindActivity(ResolveInfo resolveInfo) {
mResolveInfo = resolveInfo;
PackageManager pm = getActivity().getPackageManager();
String appName=mResolveInfo.loadLabel(pm).toString();
mNameTextView.setText(appName);
}
}

Adapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*ViewHolder 内部类显示标签名*/
private class ActivityHolder extends RecyclerView.ViewHolder {
// 创建引用信息加载获取用户标签
private ResolveInfo mResolveInfo;
// 初始化显示控件
private TextView mNameTextView;
public ActivityHolder(View itemView) {
super(itemView);
mNameTextView = (TextView) itemView;
}
public void bindActivity(ResolveInfo resolveInfo) {
mResolveInfo = resolveInfo;
PackageManager pm = getActivity().getPackageManager();
String appName=mResolveInfo.loadLabel(pm).toString();
mNameTextView.setText(appName);
}
}
/* Adapter 内部了实现数据*/
private class ActivityAdapter extends RecyclerView.Adapter<ActivityHolder> {
// 初始化数据变量
private final List<ResolveInfo> mActivities;
// 构造方法获取 activities
private ActivityAdapter(List<ResolveInfo> activities) {
mActivities = activities;
}
// 创建列表布局视图样式
@Override
public ActivityHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View view = layoutInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
return new ActivityHolder(view);
}
// 获取每个activity 信息 并与ViewHolder 进行数据传递并绑定
@Override
public void onBindViewHolder(ActivityHolder holder, int position) {
ResolveInfo resolveInfo = mActivities.get(position);
holder.bindActivity(resolveInfo);
}
// 获取整个 list 数据
@Override
public int getItemCount() {
return mActivities.size();
}
}

最后在 startupAdapter 方法下给 RecyclerView 添加Adapter,因为适配器所需要的参数,就是该方法获取到的 activity 信息

1
mRecyclerView.setAdapter(new ActivityAdapter(activities));


明天解决点击后跳转到其他应用 ヾ(◍°∇°◍)ノ゙

(*^▽^*)