丰富多彩的Intent
Intent对于android开发者是相当熟悉的了,Intent 主要负责系统中组件之间的消息传递的介质,可以通过配置其组件名、动作、数据以及类型等等特性来完成目标组件的精确查找。常见的用法
启动 Activity : startActivity startActivityForResult
发广播: sendBroadcast
启动服务: startService bindService
这里我们以启动Activity为例子,新建一个项目这个主活动的布局中只有一个按钮用来触发activity的跳转
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.change).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.change:
Intent it = new Intent(this,SecondActivity.class);
startActivity(it);
break;
}
}
相信这个代码你已经相当熟悉了,我也不用多做解释。我们这个Intent的意图十分明显就是从这个活动跳转到另外一个活动,所以我们也可以成为显式Intent,聪明的你可能已经想到了,既然有显示的当然也有隐式Intent了,接下来我们就来看看它怎么用吧。首先隐式Intent不会直接指定我们想要跳转到哪里,而是指定了一系列的action和category等信息,然后交给系统去帮我们分析。
首先在AndroidManifest中添加如下代码
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="abc123"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
接着修改MainActivity点击监听中的代码如下
Intent it = new Intent();
it.setAction("abc123");
startActivity(it);
同样能达到跳转的目的,不过我们在AndroidManifest中添加的
<category android:name="android.intent.category.DEFAULT"/>
似乎没派上用场啊!其实是因为它是一种默认的category我们在调用startActivity时会自动将这个category加载到Intent里面去的。
值得注意的是,每个Intent只能指定一个action,但是可以指定多个category,同样的修改监听代码如下
Intent it = new Intent();
it.setAction("abc123");
it.addCategory("android.intent.category.APP_BROWSER");
startActivity(it);
点击按钮你会发现程序崩溃了,这是因为我们在Intent中增加了一个category但是在AndroidManifest并没有声明它,所以需要在AndroidManifest中加入这行代码
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="abc123"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.APP_BROWSER"/>
</intent-filter>
</activity>
使用隐式Intent不仅仅可以启动自己程序的活动还可以启动其他的程序,比如我们需要展示百度的网页内容,额这个你自己貌似也不可能实现一个浏览器我们只需要调用系统的浏览器来打开这个网页就好了
Intent it = new Intent();
it.setData(Uri.parse("http://www.baidu.com"));
startActivity(it);