《Android编程权威指南》第 23 章,本章将创建新应用啦,叫 NerdLauncher,然后技术点是关于隐式 intent 和 intent 过滤器。本章应用呢,将会展示设备上的其他应用,还可以启动其他应用。
一、创建 NerdLauncher 项目
创建项目,添加 RecyclerView 用于显示 App 列表。
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
class MainActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mBinding.root)
mBinding.recyclerView.layoutManager = LinearLayoutManager(this)
}
}
二、解析隐式 intent
PackageManager 可用来获取所有可启动主 activity。可启动主 activity 都带有包含 MAIN 操作和 LAUNCHER 类别的 intent 过滤器。如下所示:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
新增 setupAdapter() 函数,并在 onCreate() 中调用:
private fun setupAdapter(){
val startupIntent = Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_LAUNCHER)
}
val activities = packageManager.queryIntentActivities(startupIntent,0)
Log.i(TAG, "Found ${activities.size} activities")
}
上述代码就有创建操作设为 ACTION_MAIN、类别为 CATEGORY_LAUNCHER 的隐式 intent。
PackageManager.queryIntentActivities(Intent, Int) 会返回包含所有activity(有匹配目标 intent 的过滤器)的 ResolveInfo 信息。这里参数 0 表示不打算修改查询结果。
接下来需要展示列表,使用 activity 标签名「应用名」。首先,使用ResolveInfo.loadLabel(PackageManager) 函数,对 ResolveInfo 对象中的 activity 标签按首字母排序。
在上述方法下面加入代码:
activities.sortWith(Comparator { a, b ->
String.CASE_INSENSITIVE_ORDER.compare(
a.loadLabel(packageManager).toString(),
b.loadLabel(packageManager).toString()
)
})
然后,定义一个 ViewHolder 用来显示 activity 标签名。使用成员变量存储 ResolveInfo 。
private class ActivityHolder(itemView: View):RecyclerView.ViewHolder(itemView){
private val tvName = itemView as TextView
private lateinit var resolveInfo:ResolveInfo
fun bindActivity(resolveInfo: ResolveInfo){
this.resolveInfo = resolveInfo
val packageManager = itemView.context.packageManager
val appName = resolveInfo.loadLabel(packageManager).toString()
tvName.text = appName
}
}
接下来实现 RecyclerView.Adapter:
private class ActivityAdapter(val activities:List<ResolveInfo>):RecyclerView.Adapter<ActivityHolder>(){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ActivityHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view =layoutInflater.inflate(android.R.layout.simple_list_item_1,parent,false)
return ActivityHolder(view)
}
override fun onBindViewHolder(holder: ActivityHolder, position: Int) {
val resolveInfo = activities[position]
holder.bindActivity(resolveInfo)
}
override fun getItemCount(): Int {
return activities.size
}
}
最后,把 adapter 实例配置给 RecyclerView ,在 setupAdapter 末尾处添加:
mBinding.recyclerView.adapter = ActivityAdapter(activities)
运行结果:
三、在运行时创建显式intent
接下来做点击列表,用显示 intent 启动对应的 activity 啦。
要创建启动 activity 的显式 intent,就需要从 ResolveInfo 对象中获取 activity 的包名与类名。
更新 ActivityHolder 类实现一个点击监听器,并从 activityInfo 中获取必要信息,创建一个显示 intent 去启动目标 activity。
private class ActivityHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
...
init {
tvName.setOnClickListener(this)
}
...
override fun onClick(v: View) {
val activityInfo = resolveInfo.activityInfo
val intent = Intent(Intent.ACTION_MAIN).apply {
setClassName(activityInfo.applicationInfo.packageName, activityInfo.name)
}
val context = v.context
context.startActivity(intent)
}
}
然后运行项目,点击列表 item,就可以跳转到相应的 App 了。
其他
嘿嘿,继续分两篇,周末需要玩耍,出门放松放松!
ResolveInfo 还可以获取其他信息,详情介绍请参考:
developer.android.com/reference/a…
NerdLauncher 项目 Demo 地址:
🌈关注我吖~❤️
公众号:妮K妮K妮
gem%2FAndroidGuideApp%2Ftree%2Fmaster%2FNerdLauncher “https://github.com/visiongem/AndroidGuideApp/tree/master/NerdLauncher”)
🌈关注我吖~❤️
公众号:妮K妮K妮
最后
按照国际惯例,给大家分享一套十分好用的Android进阶资料:《全网最全Android开发笔记》。
整个笔记一共8大模块、729个知识点,3382页,66万字,可以说覆盖了当下Android开发最前沿的技术点,和阿里、腾讯、字节等等大厂面试看重的技术。
因为所包含的内容足够多,所以,这份笔记不仅仅可以用来当学习资料,还可以当工具书用。
如果你需要了解某个知识点,不管是Shift+F 搜索,还是按目录进行检索,都能用最快的速度找到你要的内容。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照整个知识体系编排的。
(一)架构师必备Java基础
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
(二)设计思想解读开源框架
1、热修复设计
2、插件化框架设计
3、组件化框架设计
4、图片加载框架
5、网络访问框架设计
6、RXJava响应式编程框架设计
……
(三)360°全方位性能优化
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
……
(四)Android框架体系架构
1、高级UI晋升
2、Android内核组件
3、大型项目必备IPC
4、数据持久与序列化
5、Framework内核解析
……
(五)NDK模块开发
1、NDK开发之C/C++入门
2、JNI模块开发
3、Linux编程
4、底层图片处理
5、音视频开发
6、机器学习
……
(六)Flutter学习进阶
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter Dart语言系统入门
……
(七)微信小程序开发
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战
……
(八)kotlin从入门到精通
1、准备开始
2、基础
3、类和对象
4、函数和lambda表达式
5、其他
……
好啦,这份资料就给大家介绍到这了,有需要详细文档的小伙伴,可以微信扫下方二维码免费领取哈~