Intent是一个消息传递对象,尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:
- 启动activity
- 启动服务
- 传递广播
Intent分为显示和隐式:
一、显示Intent
完全按指定类名和Activity名来启动组件。
1、传入Activity名
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
或者启动服务
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse("http://www.example.com/image.png"));
startService(downloadIntent);
2、传入Package和Activity名
ComponentName componentName = new ComponentName("com.demo.demoapp" "com.demo.demoapp.SecondActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
二、隐式Intent
不会指定特定的组件,与Intent过滤器适配,找到要启动的组件。
隐式启动主要涉及到intent-filter中的三个标签:
- category
- action
- data
1、通过action
<activity
android:name="com.demo.demoapp.SecondActivity">
<intent-filter>
<action android:name="com.demo.intent.action.abc"/>
<category android:name="android.intent.category.efg"/>
</intent-filter>
</activity>
启动方式:
Intent intent = new Intent();
intent.setAction("com.demo.intent.action.abc");
startActivity(intent);
或者:
Intent intent = new Intent("com.demo.intent.action.abc");
startActivity(intent);
2、通过action和category
Intent intent = new Intent();
intent.setAction("com.demo.intent.action.abc");
intent.addCategory("android.intent.category.efg");
startActivity(intent);
3、通过action和data启动
data标签句法:
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string" />
data标签描述:
?/:[
例如:http://www.baidu.com:8080/person
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="com.demo.demoapp" android:host="info_activity"/>
</intent-filter>
</activity>
构成的URI为:com.demo.demoapp://info_activity
使用data标签启动activity:
Uri data = Uri.parse("com.demo.demoapp://info_activity");
Intent intent = new Intent(Intent.ACTION_MAIN,data);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
三、使用标签隐藏应用图标
给MainActivity配置标签,scheme和host任意:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="com.demo.demoapp" android:host="info_activity"/>
</activity>
作用:
因为显示应用图标必须同时满足
而加入了标签后,由于data存在,无法匹配到应用图标的条件。
所以主Home画面不在显示应用图标。
笔记:
Acitvity设置为Android设备启动Home画面的方法
<activity android:name=".HomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
将Acitvity设置为App启动默认画面
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</activity>