探究活动之--隐式Intent

来源:互联网 发布:cf经常网络出现异常 编辑:程序博客网 时间:2024/05/17 05:05

        前面学习了显式Intent,那么相比于显式Intent,隐式Intent则含蓄了很多,它不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent。并帮助我们找出合适的活动去启动。

        那到底什么叫做合适的活动呢?我们来看一下AndroidManifest.xml中的内容。


<activity android:name=".SecondActivity">    <intent-filter>        <action android:name="com.example.activitytest1.ACTION_START" />        <category android:name="android.intent.category.DEFAULT" />    </intent-filter></activity>
这段代码式AndroidManifest.xml中SecondActivity的<activity>标签里的内容,通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category。我们可以看到,在<action>标签中,指明了当前活动可以响应com.example.activitytest1.ACTION_START这个action。而<category>标签则更精确的指明了当前活动能够响应的Intent中还有可能带有的category。只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应Intent。
现在我们修改FirstActivity中按钮的点击事件,如下所示:
public class FirstActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.first_layout);  //在活动中加载first_layout布局        Button button1 = (Button) findViewById(R.id.button_1);        button1.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Intent intent = new Intent("com.example.activitytest1.ACTION_START");                startActivity(intent);            }        });    }}
在这段代码中,可以看到,Intent中使用了另一个构造函数,直接将action的字符串传进去,表明我们想要启动能够响应com.example.activitytest1.ACTION_START的这个action活动。现在我们运行一下程序,来看一下效果:
在FirstActivity界面点击button1按钮,跳转到了SecondActivity活动界面。可以看到,我们成功的通过隐式Intent启动了合适的活动。
但是,前面不是说要<action>和<category>要同时匹配才能响应吗?怎么没有看到FirstActivity的Intent中指定category呢?这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法时会自动将这个category添加到Intent中。
现在我们在FirstActivity中指定一个category,代码如下所示:
public class FirstActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.first_layout);  //在活动中加载first_layout布局        Button button1 = (Button) findViewById(R.id.button_1);        button1.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Intent intent = new Intent("com.example.activitytest1.ACTION_START");                intent.addCategory("com.example.activitytest1.MY_CATEGORY");                startActivity(intent);            }        });    }}
在button1点击事件中,我们调用Intent中的addCategory()方法来添加一个category,这里我们指定了一个自定义的category,值为com.example.activitytest1.MY_CATEGORY。现在运行一下程序,来看一下效果:
点击button1,我们发现,程序竟然崩溃了。这是什么原因呢?我们从崩溃日志中发现,原来是因为没有任何一个活动可以响应我们的Intent。为什么呢?这是因为我们刚刚在Intent中新增了一个category,而SecondActivity的<intent-filter>标签中没有声明响应这个category,我们找不到响应的活动,自然程序就会崩溃。现在我们来添加一个category,如下所示:
现在SecondActivity的<intent-filter>标签中有对应响应的category了,来运行一下程序,我们发现,一切正常。
关于隐式Intent的用法还有很多,比如打开一个网页或者拨打电话等功能,都是万变不离其宗,大家理解了这篇隐式Intent的用法之后,其他的也就迎刃而解了。

原创粉丝点击