探究活动之--隐式Intent

        前面学习了显式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的用法之后,其他的也就迎刃而解了。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值