Android Intents

Android Intent 是 Android 进程间交互,进程内组件间交互的中介.

Intent 分为两种:
显式Intent:与具体组件关联.
隐式Intent:声明关联Action.

隐式Intent:
1.
Activity 声明接收 Intent 类型
<intent-filter>
<action android:name="公司名.intent.action.ActionName" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

2.
调用 Activity
Intent intent = new Intent("公司名.intent.action.ActionName");
intent.setData(null);
parentActivity.startActivity(intent);

3.
Android 预定义的 Intent
Intent.ACTION_VIEW
Intent.ACIION_EDIT
Intent.ACTION_PICK
Intent.ACTION_WEB_SERACH
Intent.ACIION_DIAL
Intent.ACTION_CALL

4.
action 名字相同的 Intent,Andriod OS 如何决定调用哪个 Activity?
a.根据 schema.URI 的协议匹配.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:schema="http" />
<data android:schema="https" />
</intent-filter>

5.
数据子元素:
<host>
<mimeType>
<path>
<pathPattern>
<pathPrefix>
<port>
<schema>

<mimeType>经常用到:
匹配多个记录
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="vnd.android.cursor.dir/vnd.tl.android.note" />
</intent-filter>

匹配一条记录
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="vnd.android.cursor.item/vnd.tl.android.note"/>
</intent-filter>


6.extra

除了data属性外,extra也可以附加数据.
数据以键值对方式存储.键是字符串类型 ,而值是基本类型或实现Parcelable接口的对象.
extra 代表 android.os.Bundle.
Bundle bundle = intent.getExtras();
Bundel anotherBundle = new Bundle();
intent.putExtras(anotherBundle); //复制extra 数据到anotherBundle.


7.category
用于设定Activity放置的位置.
嵌入lanucher
嵌入home
嵌入Activity
嵌入菜单
嵌入Preferences
default

8.获取运行程序列表
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List myApps = getPackggetManager().queryIntentActivities(intent, 0);




显式Intent:

Intent intent = new Intent(parentActivity, activity.class);
parentActivity.startActivity(intent);



Intent 如何解析:

如果Intent指定关联的组件名,则忽略其它属性.只对关联的组件有效.
否则
根据action属性查找,若intent-filter中指定action且没有其它属性,则调用组件.
若有多个组件匹配,android os 会出现一个组件选择器,供用户选择.
然后
根据data属性匹配.先根据schema匹配,然后根据URI和URI Data 类型.
最后
根据category.
查找 intent-filter 中声明的 category.匹配则调用.只用于ACITON_PICK.


调用 Activity 并返回结果:
调用:
startActivityForResult(Intent intent, int requestCode);

结果回调:
onActivityResult(int requestCode, int resultCode, Intent data);

示例:
public static void invokePick(Activity activity){
    Intent intent = new Intent(Intent.ACTION_PICK);
    int requestCode = 1;
    intent.setData(Uri.parse("contetn://tl.android.provider.NotePad/notes"));
    activity.startActivityForResult(intent, requestCode);
}


protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    parseResult(this, requestCode, resultCode, data);
}

public static void parseResult(Activity activity, int requestCode, int resultCode, Intent data){
    if(requestCode != 1){
        Log.d(TAG, "Some one else called this, no us!");
        return;
    }
    if(resultCode != Activity.RESULT_OK){
        Log.d(TAG, "Result code is not ok! " + resultCode);
        return;
    }
    Log.d(TAG, "Result code is " + resultCode);

    Uri uri = data.getData();
    Log.d(TAG, "URI is " + uri.toString());

    data.setAction(Intent.View);
    startActivity(data);
}

















你可能感兴趣的:(Web,android,OS,嵌入式)