探究活动之--隐式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的标签里的内容,通过在标签下配置的内容,可以指定当前活动能够响应的action和category。我们可以看到,在标签中,指明了当前活动可以响应com.example.activitytest1.ACTION_START这个action。而标签则更精确的指明了当前活动能够响应的Intent中还有可能带有的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启动了合适的活动。
但是,前面不是说要要同时匹配才能响应吗?怎么没有看到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的标签中没有声明响应这个category,我们找不到响应的活动,自然程序就会崩溃。现在我们来添加一个category,如下所示:
 
  
 
  
 
  
现在SecondActivity的标签中有对应响应的category了,来运行一下程序,我们发现,一切正常。
关于隐式Intent的用法还有很多,比如打开一个网页或者拨打电话等功能,都是万变不离其宗,大家理解了这篇隐式Intent的用法之后,其他的也就迎刃而解了。
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  

你可能感兴趣的:(android入门,android开发)