Android intent 显示和隐士意图


  在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.  然后 我们选择其中一个 使用。

比如 我们做的是个 打电话的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);
	
		
	}

}

      还有一些打电话 发短信 等 一些启动其他程序的隐士意图 就不说了,比较简单。  对于隐士意图用的比较少的 相信会有收获。


你可能感兴趣的:(android)