1.Android中 intent 显式启动与隐式启动
1.1 显式启动代码
显式Intent:通过指定Intent组件名称来实现,用new Intent(A.this,B.class)指明需要转向到的Activity。
FirstActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(FirstActivity.this,"哈哈",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
https://blog.csdn.net/luohai859/article/details/7368745
//显式Intent写法为:
Uri uri=Uri.parse("app://test");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
1.android.intent.category.DEFAUL 是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到intent中
//不加下面这行也行,因为intent的这个属性默认值即系Intent.CATEGORY_DEFAULT
intent.addCategory(Intent.CATEGORY_DEFAULT);
1.2 隐式启动代码
清单文件-AndroidManifest.xml
清单文件注册Activity
隐式启动不同之处在于我们并不需要像Intent(MainActivity.this, SecondActivity.class)这样传参数然后再Start另一个Activity.我们需要在intent添加过滤器intentfilter。
隐式Intent:通过在清单文件中配置IntentFilter来实现。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
在不同应用程序之间,如果想隐式intent不可以被跨应用启动只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。
需要在intent添加过滤器intentfilter。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.deligence.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
隐式启动Activity的intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data,可以是全部或部分匹配。
(同样适用于Service和BroadcastReceiver)
<action> 标签中我们指明了当前活动可以响应com.example.deligence.ACTION_START
而<category>标签包含了一些附加信息,更精确地表明了当前活动能够响应的Intent中还可能带有的category.
只有<action>和<category>中的内容
能同时匹配上intent指定的action和category时,这个活动才能响应改intent
1.任何一个需要隐式启动的Activity都必须要有这项android.intent.category.DEFAULT:
<category android:name="android.intent.category.DEFAULT"/>
例外情况:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题
FirstActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.deligence.ACTION_START");
startActivity(intent);
}
});
}
Useful links
https://abhiandroid.com/programming/intent-filter
https://www.tutorialspoint.com/android/android_intents_filters.htm