在Android中,经常会使用到 intent. 但是一般 使用的比较多的 是显示意图。隐士意图用的比较少
先了解定义:
1. 显示意图;有明确指定条件 指定需要启动的组件; 通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
2. 隐式意图;没有明确指定要启动的组件,但是是有条件的指定 ,组件通过Intent Filter来实现的,它一般用在没有 明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
显示意图每个项目都有使用很多, 如跳转界面时 我们明确知道要跳转到哪个界面
public class MainActivity extends Activity { private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button)findViewById(R.id.btn); //响应按钮btn事件 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //显示方式声明Intent,直接启动SecondActivity Intent it = new Intent(MainActivity.this,SecondActivity.class); //启动Activity startActivity(it); } }); } }
比如 我们做的是个 打电话的APP,当用户 在 其他程序(如QQ 微信 )等 接受到 别人发的电话号码,点击拨打 。怎么样让我们自己的程序 出现 让用户选择? 了解下面内容 就能有对隐士意图的使用有个清晰的概念。
接过上面的问题 我们先看看 意图过滤器 intentFilter.
<intent-filter>
<!--动作-->
<action android:name="android.intent.action.CALL" />
<!--类别->
<category android:name="android.intent.category.DEFAULT" />
<!--数据-->
<data >
</intent-filter>
可以有多个动作 ,类别 和 多个数据。 那么它们之间的关系是什么? 不同种标签是并且关系 同种标签是 或者关系
我们首先来看看 系统打电话的源码 里面的 意图过滤器是怎么写的
<activity-alias android:name="PrivilegedOutgoingCallBroadcaster" android:targetActivity="OutgoingCallBroadcaster" android:theme="@android:style/Theme.NoDisplay" android:permission="android.permission.CALL_PRIVILEGED"> <intent-filter> <action android:name="android.intent.action.CALL_PRIVILEGED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="tel" /> </intent-filter> <intent-filter android:icon="@drawable/ic_launcher_sip_call"> <action android:name="android.intent.action.CALL_PRIVILEGED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="sip" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.CALL_PRIVILEGED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="voicemail" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.CALL_PRIVILEGED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/phone" /> <data android:mimeType="vnd.android.cursor.item/phone_v2" /> <data android:mimeType="vnd.android.cursor.item/person" /> </intent-filter> </activity-alias>
不同种标签是并且关系 同种标签是 或者关系。 怎么理解这句话?
多个 意图过滤器 之间是 或者关系,也就是 这个应用 既可以打普通的 电话(tel),还可以打网络电话(sip),还能发语音邮件(voicemail);
单个意图过滤器里面是并且的关系 也就是 动作 需要满足条件 并且 你的 类型也需要满足,还有data的格式 都满足时候 才能调用。
想清楚上面的东西。想要在打开我们的资源时 出现我们自己的APP选项并不难了。
下面通过一个demo让大家 加深印象 比如我们就打开sd卡目录下的一个txt文件
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void jump(View v){ Intent intent = new Intent(); intent.setAction("com.xxx.ReadText"); File file = new File("/mnt/sdcard/mypersons.txt"); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "text/html"); startActivity(intent); } }
<activity android:name="com.ww.MyTxtReaderActivity"> <intent-filter > <action android:name="com.xxx.ReadText"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="file" android:mimeType="text/html"/> </intent-filter> </activity> </application>
选择被打开的界面 接收数据 展示数据等等......
public class MyTxtReaderActivity extends Activity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.txt_layout); tv = (TextView)findViewById(R.id.textView1); Intent intent = getIntent(); Uri data = intent.getData(); String path = data.getPath(); System.out.println(path); } }