《Android编程权威指南》之深入学习intent和任务(一)

62 篇文章 1 订阅
19 篇文章 1 订阅

《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 表示不打算修改查询结果。

activities

接下来需要展示列表,使用 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) 

运行结果:

result

三、在运行时创建显式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 地址:

github.com/visiongem/A…


🌈关注我吖~❤️

公众号:妮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、其他

……

图片

好啦,这份资料就给大家介绍到这了,有需要详细文档的小伙伴,可以微信扫下方二维码免费领取哈~

图片

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值