目的:实现在FirstActivity的活动中跳转到SecondActivity。
在此我们使用的是LinearLayout
打开layout下second_layout.xml文件 将里面的代码替换如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 2" /> </LinearLayout>其中android:orientation="vertical"表示该活动的布局方向是垂直的
match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小
wrap_content表示让当前的控件大小能够刚好包含里面的内容,也就是由控件内容决定当前控件的大小
然后SecondActivity中已生成如下代码:
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(BUndle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_layout); } }显式Intent要调用一个构造函数 Intent(Context packageContext, Class<?> cls) 。 这个构造函数接收两个参数,第一个参数Context 要求提供一个启动活动的上下文, 第二个参数Class 则是指定想要启动的目标活动。
Activity类中提供了一个startActivity() 方 法,这个方法是专门用于启动活动的,它接收一个Intent 参数
修改FirstActivity里的按钮点击事件。代码如下:
button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); } });相比于显式Intent,隐式Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指 定了一系列更为抽象的action 和category 等信息,然后交由系统去分析这个Intent,并帮我 们找出合适的活动去启动。
通过在 标签下配置 的内容,可以指定当前活动能够响应的 action 和category 。
<activity android:name=".SecondActivity" > <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>com.example.activitytest是我们定义的包
com.example.activitytest.ACTION_START 这个action ,而 标签则包含 了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category 。只有action和category 中的内容同时能够匹配上Intent中指定的action 和category 时,这个活动才能响应该Intent。
修改FirstActivity中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.activitytest.ACTION_START"); startActivity(intent); } });每个Intent中只能指定一个action ,但却能指定多个category 。目前我们的Intent中只有一个 默认的category ,那么现在再来增加一个吧。
修改FirstActivity中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.activitytest.ACTION_START"); intent.addCategory("com.example.activitytest.MY_CATEGORY"); startActivity(intent); } });现在重新运行程序,在FirstActivity的界面点击一下按钮,你会发现,程序崩溃了!这是你第一 次遇到程序崩溃,可能会有些束手无策。别紧张,其实大多数的崩溃问题都是很好解决的,只 要你善于分析。在logcat界面查看错误日志,你会看到如图2.16所示的错误信息。
每个Intent中只能指定一个action ,但却能指定多个category 。目前我们的Intent中只有一个 默认的category ,那么现在再来增加一个吧。
修改FirstActivity中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.activitytest.ACTION_START"); intent.addCategory("com.example.activitytest.MY_CATEGORY"); startActivity(intent); } });现在重新运行程序,在FirstActivity的界面点击一下按钮,你会发现,程序崩溃了!这是你第一 次遇到程序崩溃,可能会有些束手无策。别紧张,其实大多数的崩溃问题都是很好解决的,只 要你善于分析。在logcat界面查看错误日志,你会看到如下图所示的错误信息。
错误信息中提醒我们,没有任何一个活动可以响应我们的Intent,为什么呢?这是因为我们刚刚 在Intent中新增了一个category ,而SecondActivity的 标签中并没有声明 可以响应这个category ,所以就出现了没有任何活动可以响应该Intent的情况。现在我们 在 中再添加一个category 的声明,如下所示:
<activity android:name=".SecondActivity" > <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.example.activitytest.MY_CATEGORY"/> </intent-filter> </activity>再次重新运行程序,你就会发现一切都正常了。
还想了解更多的隐式Intent用法吗? 期待下一期(如果我不懒的话)