初学_Android4高级编程-6 Intent Filiter &Broadcast Receiver

intent-filter标签属性
action 使用android:name指定要位置服务的动作的名称。每个filter至少有一个action
标签,action应该是一个描述性的唯一的字符串
category 使用android:name属性来指定应该在那种情况下为action提供服务。可包含多个
可以指定自己的标准值,也可以使用以下Android提供的标准值
ALTERNATIVE 在特定数据类型上执行的默认动作的可选项,如一个联系人的默认动作是查看其信息,而可选动作是对其进行编辑
SELECT_ALTERNATIVE 当有多种可选项的时候
BROWSABLE 指定一个在浏览器内部的可用动作,如截获指向特定网站的链接
DEFAULT 使一个组件成为Intent FIlter内指定的数据类型的默认动作
HOME 通过将一个Intent Filter的类别设置为HOME,而不指定一个action,就可以把
它作为本地屏幕的可选项
LAUNCHER 让一个Activity出现在应用程序的启动器中
data data标签允许指定组件可以执行的数据类型,可以使用以下任意组合来指定组件所支
持的数据
android:host 指定一个有效的主机名
android:mimetype 指定组件可执行的数据类型,如将匹配所有的Android cursor
android:path 指定URI的有效路径值(如/transport/boats)
android:port 指定主机的有效端口
android:scheme 要求一种特定的模式(如content or http)

·解析Intent Filter
当在startActivity中传入一个隐式的Intent时,决定启动哪一个Activity的过程叫做intent解析。
1.Android将已安装包的可用的Intent Filter放到一个列表中
2.与解析Intent时相关联的动作或者类别不匹配的Intent Filter将会从列表中移除
3.Intent的数据URI的每一个部分都和Intent Filter的data标签进行比较,没有指定 数据值的Intent Filter将会和所有的Intent数据值匹配
4.如果这个进程解析出多个组件,那么所有可能匹配的组件都会呈现给用户

·在Activity中找到和使用接收到的Intent
Intent intent = getIntent();
String action = intent.getAction();
Uri data = intent.getData();

·传递责任
可以通过startNextMatchingActivity方法将处理动作的责任创地道下一个最佳匹配的Activity。
Intent intent = getIntent();
if(isDuringBreak){
startNextMatchingActivity(intent);
}

通过隐式Intent跳转到读取联系人界面并选择一个联系人后返回
Androidmanifest.xml

在MainActivity中使用隐式Intent
对应action 为Intent.ACTION_PICK,Uri path为contacts 模式为content
Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/"));
startActivityForResult(intent,1);

在ContactPickActivity.java中显示联系人并setResult返回
final Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
String[] from = new String[]{ContactsContract.Contacts.DISPLAY_NAME_PRIMARY};
int[] to = new int[] {R.id.item_tv};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.listitemlayout,cursor,from,to);
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cursor.moveToPosition(position);
//获得Id
int rowId = cursor.getInt(cursor.getColumnIndexOrThrow("_id"));
//构建result URI
Uri outURI = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,rowId);
Intent outData = new Intent();
outData.setData(outURI);
setResult(Activity.RESULT_OK,outData);
finish();
}
});

在MainActivity中得到结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case(1):
if(resultCode == Activity.RESULT_OK){
Uri contactData = data.getData();
Cursor cursor =getContentResolver().query(contactData,null,null,null,null);
cursor.moveToFirst();
String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
cursor.close();
tv.setText(name);
}
}
}

·监听本地Broadcast Intent
Intent类中提供一些以常量表示的动作
Action_BOOT_COMPLETED 系统完成启动序列后触发这个动作
ACTION_CAMERA_BUTTON 单机拍照键的时候触发
ACTION_DATE_CHANGED & ACTION_TIMEZONE_CHANGED 当日期被手动修改
ACTION_MEDIA_EJECT 当用户选择弹出外部存储媒介
ACTION_MEDIA_MOUNTED &ACTION_MEDIA_UNMOUNTED 任何时候,新的外部存储媒介成功添加或从设备移除的时候
ACTION_NEW_OUTGOING_CALL 当要向外界拨打电话的时候就会进行广播,监听这个广播可以截获播出的电话呼叫,Intent中的resultData则是实际拨打的号码,需要PROCESS_OUTGON_CALL使用权限
ACTION_SCREEN_OFF & ACTION_SCREEN_ON 屏幕关闭或打开
ACTION_TIMEZONE_CHANGED 手机时区发生改变

监听电量变化
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent intent = this.registerReceiver(null, intentFilter);
int status;
if(intent!=null) {
status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
} else {
status = -2;
}
tv.setText("bat = "+status + "");
监听网络连接变化
String svcName = Context.CONNECTIVITY_SERVICE;
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(svcName);
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
boolean isConnected = activeNetwork.isConnectedOrConnecting();
boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
tv.setText("isConnected = " + isConnected + ",isMobile = " + isMobile);

posted on 2015-07-07 19:47  想做很多事  阅读(153)  评论(0)    收藏  举报

导航