第四章初次认识Intent是把它比喻成一个信封,这里正式学习它,Intent,中文意思是意图,它主要用于启动Activity,Service,BroadCast等组件的,所以Intent类就是一个表达启动组件意图的类,这就是它的定义。
启动组件的意图,有2种启动组件的方式:显式和隐式。
Intent类的属性有:Action,Category,Date,Type,Extra和Component。
看回显式启动组件的意图,既然是显示就应该讲明白启动的是哪一个组件,Component属性的值ComponentName类就直接表明要开动哪一个组件了。
ComponentName cn=new ComponentName(MainActivity.this, "com.myapp.MyActivity");
intent.setComponent(cn);
startActivity(intent);
当然有构造器直接用,效果一样,都是直接指明要启动的是哪一个组件。
其他的属性:Action,Category,Data,Type都主要用于隐式启动组件。
最重要的是Action属性,给Intent对象设置一个Action属性,表明这个意图是想找个可以做Action内容的组件,然后就去AndroidManifest.xml中每个<activity>中的<intent-filter>中找声明了可以做Action的组件,另外Category是Action的附加声明,他们两个都是字符串来的。Category不写的话也会有默认值的,所以在AndroidManifest.xml中要设置category的值为默认值,Data则是为Action提供数据的,主要是提供Uri类型的数据,Type则是提供MIME类型的数据。
intent.setAction("Hello");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
<activity
android:name="com.myapp.MyActivity">
<intent-filter>
<action android:name="Hello"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
这种隐式启动组件有一个很大的好处就是可以启动系统其他应用的组件,例如系统的电话本,浏览器什么的。
(1)与打电话有关的系统Activity的隐式意图开启
String array[]={"查看电话信息","编辑电话信息","显示拨打电话界面","直接打电话"};
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview=(ListView)findViewById(R.id.listview);
ArrayAdapter<String> adapter=new ArrayAdapter<>(MainActivity.this, R.layout.listview_item, array);
listview.setAdapter(adapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3)
{
// TODO Auto-generated method stub
Intent intent=new Intent();
Uri uri;
switch (arg2)
{
case 0:
uri=Uri.parse("content://contacts/people/4");
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
break;
case 1:
uri=Uri.parse("content://contacts/people/4");
intent.setAction(Intent.ACTION_EDIT);
intent.setData(uri);
startActivity(intent);
break;
case 2:
uri=Uri.parse("tel:110");
intent.setAction(Intent.ACTION_DIAL);
intent.setData(uri);
startActivity(intent);
break;
case 3:
uri=Uri.parse("tel:120");
intent.setAction(Intent.ACTION_CALL);
intent.setData(uri);
startActivity(intent);
break;
default:
break;
}
}
});
这里要注意下content://contacts/people就是打开联系人的路径了,后面的数字是第几个联系人,除此之外还应该声明程序需要哪些权限,有权限才能开启到系统的activity
<uses-permission
android:name="android.permission.CALL_PHONE"/>
<uses-permission
android:name="android.permission.READ_CONTACTS"/>
<uses-permission
android:name="android.permission.WRITE_CONTACTS"/>
(2)打开浏览器,地图
case 4:
uri=Uri.parse("http://www.baidu.com");
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
break;
case 5:
uri=Uri.parse("http://ditu.google.cn/maps?hl=zh&mrt=loc&q=39.940409,116.355257(西直门)");
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
break;
Extra属性,用来组件之间的数据交换的,intent.putExtra()可以放一个Bundle对象到Intent中,通过这个意图打开的组件,getIntent之后,利用intent,getExtra()可以得到这个Bundle对象,然后拿到里面的数据。
Flag属性: