Android 隐式 Intent
我们从前几章节中学习到,所以隐式启动 Intent
就是根据启动类 (category) 或者动作 (action) 名启动一组组件
隐式 Intent
不用指定组件名,而是指定要启动的组件的 category
、action
和 data
这时候 Android 系统会去适配 AndroidManifest.xml
中相关组件的 Intent-filter
逐一匹配出满足属性的组件,当不止一个满足时,会弹出一个让我们选择启动哪个的对话框
Intent 中的五个属性,
Extra
和flags
是不参与匹配的
隐式 Intent 的类别
-
包含预定义动作的隐式 Intent
我们知道
Android
系统内建了一些具有相同category
和action
的组件,这些我们如果我们的
Activity
的action
和category
设置和它们一样,就称之为包含预定义动作的隐式 Intent
-
包含自定义动作的隐式 Intent
如果我们的 Activity
的 action
和 category
都是我们自己设置的,那么就称之为 包含自定义动作的隐式 Intent
一句话,如果 action
和 category
使用的是 android.intent
开头的,则为预定于,否则为自定义
范例
我们用一个 demo 来演示下这两种类别
-
创建一个 空的 Android 项目
cn.twle.android.ImplicitIntent
-
修改
activity_main.xml
添加一个<Button>
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_start" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="启动另一个 Activity" /> </LinearLayout>
-
在
res/layout
新建一个布局activity_second.xml
,很简单,就一个<TextView>
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="我是第二个 Activity" /> </LinearLayout>
-
新建
SecondActivity
,在MainActivity.java
新建文件SecondActivity.java
package cn.twle.android.implicitintent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } }
预定义动作的隐式 Intent
-
修改
MainActivity.java
package cn.twle.android.implicitintent; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_start = findViewById(R.id.btn_start); btn_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 启动一组 action=View 的 Activity Intent it = new Intent(); it.setAction(Intent.ACTION_VIEW); startActivity(it); } }); } }
-
然后修改
AndroidManifest.xml
添加SecondActivity
我们给
SecondActivity
指定了action
和category
<activity android:name=".SecondActivity" android:label="第二个Activity"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
运行 APP,点击 启动另一个 Activity ,所有 Action 为 VIEW 的 Activity 被筛选出来,由用户进一步选择
自定义动作的隐式 Intent
接下来我们使用自定义的 action
与 category
来激活 SedondActivity
-
复用上面的范例
-
修改
AndroidManifest.xml
中的SecondActivity
<activity android:name=".SecondActivity" android:label="第二个 Activity"> <intent-filter> <action android:name="ms_action"/> <category android:name="ms_category"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
虽然我们自定义了一个 category , 但是还是要把默认的加上,不然会报错的
-
修改
MainActivity.java
package cn.twle.android.implicitintent; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_start = findViewById(R.id.btn_start); btn_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 启动一组 action=View 的 Activity Intent it = new Intent(); it.setAction("ms_action"); it.addCategory("ms_category"); startActivity(it); } }); } }
运行 APP,点击 启动另一个 Activity ,所有 action 为 ms_action
的 Activity 被筛选出来,由用户进一步选择 (只有一个,所以不用选择,直接跳转了)
我们可以多定义几个 action,设置一些 category 相同,一些 action 相同,多试试,你就能明白了