Android: 通过 intent 启动 Activity
2017-09-01 12:01
543 查看
通过 intent 启动 Activity
Intent 种类
Exported 属性
Category
总结
Explicit Intent 启动 Activity
Implicit Intent 启动Activity
Explicit intents 显示意图 通过指定明确的包名和类名来启动一个组件,一般多用于同一个app 之间的组件相互启动
Implicit intents 隐式意图 通过指定action,category,data 等方式来启动一个组件,一般用于不同app 之间相互启动
(从android 5.0 开始不能用 implicit intent 去 startService or bindService ,不管是app内还是不同app之间,否则会跑如下异常:
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent )
注意:如果对new 的intent 对象同时设置了action 和 和包名,类名,那么intent 为explicit 的
activity 属性标签中是否添加
如果 activity 中添加了
如果 activity 中不添加了
因为调用startActivity() and startActivityForResult() 的时候系统会为implicit intent 的 IntentFilter 自动设置category 为android.intent.category.DEFAULT,所有如果没有在
启动不同App 的Activity需要 activity 的exported 属性为true:
显示声明exported = true
通过添加
注意:如果exported = false,就要抛 SecurityException: Permission Denial
同意一个App 内 exported 可以为false,不添加intent-filter 的情况下默认为false
不同App export 必须为true,如果为false 就要抛 SecurityException: Permission Denial
显示声明exported = true
通过添加
Intent 种类
Exported 属性
Category
总结
Explicit Intent 启动 Activity
Implicit Intent 启动Activity
通过 intent 启动 Activity
Intent 种类
Intent 有两种:Explicit intents 显示意图 通过指定明确的包名和类名来启动一个组件,一般多用于同一个app 之间的组件相互启动
Implicit intents 隐式意图 通过指定action,category,data 等方式来启动一个组件,一般用于不同app 之间相互启动
(从android 5.0 开始不能用 implicit intent 去 startService or bindService ,不管是app内还是不同app之间,否则会跑如下异常:
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent )
注意:如果对new 的intent 对象同时设置了action 和 和包名,类名,那么intent 为explicit 的
Exported 属性
AndroidManifest.xml 中 activity 的 exported 属性标志做Activity 是否能被第三方app 的组件(component)启动,true能启动
false不能启动,如果
false那么该activity 只能被通用一个App内拥有相同 userid 的component启动
activity 属性标签中是否添加
<intent-filter>属性标签 exported 的默认值不一样,如果添加了默认为true,不添加为false
如果 activity 中添加了
<intent-filter>标签,默认exported = true,一般来说这个activity的设计用途就是被运行第三方app所启动的,此时你就不应该把exported 设为false,那样就显得没有意义了(当然你也可以这么做,只是activity就变成只能被app内的component 启动,如果是为了这个目的干嘛不去掉
<intent-filter>这样export默认就为false,岂不是更简单),
如果 activity 中不添加了
<intent-filter>标签,默认exported = false,如果你把起设置exported= true,那么activity 允许任何组件(app内或者其他app)通过explicit intent启动,不能被implicit intent 启动,因为都没有添加
<intent-filter>所以任何 implicit intent 都不能被解析
Category
category相关解析请看官网解释,这儿主要说明一下当一个activity 需要接受一个implicit intent 的时候需要把 category 的name 设置为 android.intent.category.DEFAULT,因为调用startActivity() and startActivityForResult() 的时候系统会为implicit intent 的 IntentFilter 自动设置category 为android.intent.category.DEFAULT,所有如果没有在
<intent-filter>标签中声明category 为 android.intent.category.DEFAULT 那么所有的implicit intent都不能被该activity 接受
总结:
Explicit Intent 启动 Activity
App内拥有同样userid 的activity 可以任意启动,不会有任何问题启动不同App 的Activity需要 activity 的exported 属性为true:
显示声明exported = true
通过添加
<intent-filter>让exported 变为true
注意:如果exported = false,就要抛 SecurityException: Permission Denial
Implicit Intent 启动Activity
所有需要能被implicit intent 启动的Activity不论是同app内还是不同app之间 都要在 intent-filter 标签中 添加 category 属性并设置为default.不然要抛ActivityNotFound 异常.同意一个App 内 exported 可以为false,不添加intent-filter 的情况下默认为false
不同App export 必须为true,如果为false 就要抛 SecurityException: Permission Denial
显示声明exported = true
通过添加
<intent-filter>让exported 变为true
相关文章推荐
- Android - 通过Intent启动Activity
- android 通过点击上下文菜单采用intent启动activity
- android 通过 包名启动Activity及intent.addCategory(Intent.CATEGORY_LAUNCHER);遗留问题
- android 通过点击上下文菜单采用intent启动activity
- Android 浏览器的研究(六)--- ADT调试通过Intent启动的Activity
- android应用开发实践三----Atcity 通过Intent 来启动另一个Activity来实现简易拨号
- android 通过点击上下文菜单采用intent启动activity
- Android - 通过Intent启动Activity
- Android 之Activity启动模式(二)之 Intent的Flag属性
- Android 中拦截 Activity 的启动(拦截系统的 Intent)
- Android开发——通过广播启动另一个应用的Activity
- Android中通过intent启动另一个应用
- 【Android基础】Activity启动模式以及Intent Flags 与 栈 的全面解析
- Android - 使用Intent来启动Activity
- android深入解析Activity的launchMode启动模式,Intent Flag,taskAffinity
- [置顶] Android开发值利用Intent进行put传值,setclass启动activity,并用get进行取值
- Android中使用Notification并通过点击Notification启动启动通知详细Activity,点击返回键和按钮返回主界面
- Android 之Activity启动模式(二)之 Intent的Flag属性
- android面试03--通过startActivity(intent)调用Activity中的方法与new Activity调用Activity中方法的区别
- 通过intent启动Activity