之前博文《Android学习笔记之——activity》已经对Android开发的activity做了基本的介绍了。但是,在启动器中点击应用的图标只会进入到该应用的主活动,本博文学习一下由主活动跳转到其他活动。
目录
创建second activity
仍然还是右击com.example.activitytest包→New→Activity→Empty Activity,会弹出一个创建活动的对话框
Android Studio会为我们自动生成SecondActivity.java和second_layout.xml这两个文件。
打开Layout,编辑second_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2"
/>
</LinearLayout>
对于SecondActivity
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
}
}
任何一个活动都是需要在AndroidManifest.xml中注册的,不过幸运的是,Android Studio已经自动完成了,可以打开AndroidManifest.xml瞧一瞧:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SecondActivity"></activity>
<activity android:name=".FirstActivity">
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
由于SecondActivity不是主活动,因此不需要配置<intent-filter> 标签里的内容,注册活动的代码也简单了许多。现在第二个活动已经创建完成。
启动第二个活动——Intent
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景。本博文先介绍一下Intent启动活动
显式Intent
Intent有多个构造函数的重载,其中一个是
Intent(Context packageContext, Class<?>cls)
这个构造函数接收两个参数,
- 第一个参数Context 要求提供一个启动活动的上下文
- 第二个参数Class 则是指定想要启动的目标活动
通过这个构造函数就可以构建出Intent的“意图”。Activity类中提供了一个startActivity() 方
法,这个方法是专门用于启动活动的,它接收一个Intent 参数,所以只需要将构建好的Intent传入startActivity() 方法就可以启动目标活动了。
将博文文Android学习笔记之——activity》中的按钮点击代码改为:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
//重写onCreateOptionsMenu方法,将菜单显示出来
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通过getMenuInflater() 方法能够得到MenuInflater 对象
//再调用它的inflate() 方法就可以给当前活动创建菜单了
//inflate() 方法接收两个参数,
//第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
//第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
return true;
//返回true ,表示允许创建的菜单显示出来
//若返回了false ,创建的菜单将无法显示。
}
//重写onOptionsItemSelected方法,定义菜单的相应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
************************************///
//定义布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
///**********************///
Button button1=(Button) findViewById(R.id.button_1);
//通过findViewById() 方法获取到在布局文件中定义的元素
//在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
//findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重写
public void onClick(View v) {
Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//构建出intent的“意图”
startActivity(intent);//启动活动
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// //通过调用setOnClickListener() 方法为按钮注册一个监听器
// //点击按钮时就会执行监听器中的onClick() 方法。
// @Override //表示重写
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
// //通过静态方法makeText() 创建出一个Toast对象
// //并通过show()将Toast显示出来
//
// // makeText() 方法需要传入3个参数。
// // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
// // 第二个参数是Toast显示的文本内容,
// // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
隐式Intent
对于隐式Intent并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action 和category 等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。
在AndroidManifest.xml中。SecondActivity配置<intent-filter> 标签里的内容,可以指定当前活动能够响应的action 和category(类别)
只有<action> 和<category> 中的内容同时能够匹配上Intent中指定的action 和category时,这个活动才能响应该Intent。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SecondActivity"></activity>
<intent-filter>
<action android:name="com.example.ActivityTest.ACTION_START" />
//在<action> 标签中我们指明了当前活动可以响应
com.example.activitytest.ACTION_START 这个action
<category android:name="android.intent.category.DEFAULT" />
//更精确地指明了当前的活动能够响应的Intent中还可能带有的category
</intent-filter>>
<activity android:name=".FirstActivity">
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
然后修改FirstActivity中按钮的点击事件:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
//重写onCreateOptionsMenu方法,将菜单显示出来
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通过getMenuInflater() 方法能够得到MenuInflater 对象
//再调用它的inflate() 方法就可以给当前活动创建菜单了
//inflate() 方法接收两个参数,
//第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
//第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
return true;
//返回true ,表示允许创建的菜单显示出来
//若返回了false ,创建的菜单将无法显示。
}
//重写onOptionsItemSelected方法,定义菜单的相应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
************************************///
//定义布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
///**********************///
Button button1=(Button) findViewById(R.id.button_1);
//通过findViewById() 方法获取到在布局文件中定义的元素
//在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
//findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重写
public void onClick(View v) {
Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//构建出intent的“意图”
startActivity(intent);//启动活动
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重写
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //构建出intent的“意图”
// startActivity(intent);//启动活动
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通过调用setOnClickListener() 方法为按钮注册一个监听器
// //点击按钮时就会执行监听器中的onClick() 方法。
// @Override //表示重写
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
// //通过静态方法makeText() 创建出一个Toast对象
// //并通过show()将Toast显示出来
//
// // makeText() 方法需要传入3个参数。
// // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
// // 第二个参数是Toast显示的文本内容,
// // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
得到的效果与显示intent一样的
每个Intent中只能指定一个action ,但却能指定多个category 。
目前我们的Intent中只有一个默认的category ,那么现在再来增加一个吧。
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
//重写onCreateOptionsMenu方法,将菜单显示出来
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通过getMenuInflater() 方法能够得到MenuInflater 对象
//再调用它的inflate() 方法就可以给当前活动创建菜单了
//inflate() 方法接收两个参数,
//第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
//第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
return true;
//返回true ,表示允许创建的菜单显示出来
//若返回了false ,创建的菜单将无法显示。
}
//重写onOptionsItemSelected方法,定义菜单的相应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
************************************///
//定义布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
///**********************///
Button button1=(Button) findViewById(R.id.button_1);
//通过findViewById() 方法获取到在布局文件中定义的元素
//在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
//findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重写
public void onClick(View v) {
Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//构建出intent的“意图”
intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
//调用Intent中的addCategory() 方法来添加一个category
startActivity(intent);//启动活动
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重写
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //构建出intent的“意图”
// startActivity(intent);//启动活动
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通过调用setOnClickListener() 方法为按钮注册一个监听器
// //点击按钮时就会执行监听器中的onClick() 方法。
// @Override //表示重写
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
// //通过静态方法makeText() 创建出一个Toast对象
// //并通过show()将Toast显示出来
//
// // makeText() 方法需要传入3个参数。
// // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
// // 第二个参数是Toast显示的文本内容,
// // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
对于新增的category,到AndroidManifest.xml中。SecondActivity配置<intent-filter>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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>
<activity android:name=".FirstActivity">
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
更多隐式Intent的用法(启动其他activity)
使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如说应用程序中需要展示一个网页,这时没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用系统的浏览器来打开这个网页就行了。
修改FirstActivity中按钮点击事件的代码,如下所示:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
//重写onCreateOptionsMenu方法,将菜单显示出来
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通过getMenuInflater() 方法能够得到MenuInflater 对象
//再调用它的inflate() 方法就可以给当前活动创建菜单了
//inflate() 方法接收两个参数,
//第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
//第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
return true;
//返回true ,表示允许创建的菜单显示出来
//若返回了false ,创建的菜单将无法显示。
}
//重写onOptionsItemSelected方法,定义菜单的相应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
************************************///
//定义布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
///**********************///
Button button1=(Button) findViewById(R.id.button_1);
//通过findViewById() 方法获取到在布局文件中定义的元素
//在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
//findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重写
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android内部动作)
//构建出intent的“意图”
intent.setData(Uri.parse("http://www.baidu.com"));
//通过Uri.parse() 方法,将一个网址字符串解析成一个Uri对象,
//再调用Intent的setData() 方法将这个Uri 对象传递进去
//setData()接收一个Uri 对象,主要用于指定当前Intent正在操作的数据,
// 而这些数据通常都是以字符串的形式传入到Uri.parse() 方法中解析产生的
startActivity(intent);//启动活动
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重写
// public void onClick(View v) {
// Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
// //构建出intent的“意图”
// intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
// //调用Intent中的addCategory() 方法来添加一个category
//
// startActivity(intent);//启动活动
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重写
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //构建出intent的“意图”
// startActivity(intent);//启动活动
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通过调用setOnClickListener() 方法为按钮注册一个监听器
// //点击按钮时就会执行监听器中的onClick() 方法。
// @Override //表示重写
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
// //通过静态方法makeText() 创建出一个Toast对象
// //并通过show()将Toast显示出来
//
// // makeText() 方法需要传入3个参数。
// // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
// // 第二个参数是Toast显示的文本内容,
// // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
一开始会提醒缺少Uri这个量,通过“alt+shift+enter”就可以自动增加import了(不得不感叹一下,真方便hhh)
运行结果如下图所示
除此之外,还可以在<intent-filter> 标签中再配置一个<data> 标签,用于更精确地指定当前活动能够响应什么类型的数据。<data> 标签中主要可以配置以下内容。
- android:scheme 。用于指定数据的协议部分,如上例中的http部分。
- android:host 。用于指定数据的主机名部分,如上例中的www.baidu.com部分。
- android:port 。用于指定数据的端口部分,一般紧随在主机名之后。
- android:path 。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
- android:mimeType 。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有<data> 标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。不过一般在<data> 标签中都不会指定过多的内容,如上面浏览器示例中,其实只需要指定android:scheme 为http,就可以响应所有的http协议的Intent了。(甚至不指定也可以正常运行)
构建一个活动能响应Intent
构建一个新的activity,然后编辑third_layout.xml,将里面的代码替换成如下内容:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 3"
/>
</LinearLayout>
ThirdActivity中的代码保持不变。在AndroidManifest.xml中修改ThirdActivity的注册信息:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
<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>
<activity android:name=".FirstActivity">
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
可以看到,系统自动弹出了一个列表,显示了目前能够响应这个Intent的所有程序
选择浏览器会出现之前的百度主页;选择ActivityTest,则会启动ThirdActivity
除了http协议外,我们还可以指定很多其他协议,比如geo表示显示地理位置、tel表示拨打电话。
修改FirstActivity代码如下:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
//重写onCreateOptionsMenu方法,将菜单显示出来
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通过getMenuInflater() 方法能够得到MenuInflater 对象
//再调用它的inflate() 方法就可以给当前活动创建菜单了
//inflate() 方法接收两个参数,
//第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
//第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
return true;
//返回true ,表示允许创建的菜单显示出来
//若返回了false ,创建的菜单将无法显示。
}
//重写onOptionsItemSelected方法,定义菜单的相应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
************************************///
//定义布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
///**********************///
Button button1=(Button) findViewById(R.id.button_1);
//通过findViewById() 方法获取到在布局文件中定义的元素
//在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
//findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重写
public void onClick(View v) {
// Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android内部动作)
// //构建出intent的“意图”
// intent.setData(Uri.parse("http://www.baidu.com"));
// //通过Uri.parse() 方法,将一个网址字符串解析成一个Uri对象,
// //再调用Intent的setData() 方法将这个Uri 对象传递进去
// //setData()接收一个Uri 对象,主要用于指定当前Intent正在操作的数据,
// // 而这些数据通常都是以字符串的形式传入到Uri.parse() 方法中解析产生的
//电话
Intent intent=new Intent(Intent.ACTION_DIAL);//Intent的action 是Intent.ACTION_DIAL
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);//启动活动
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重写
// public void onClick(View v) {
// Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
// //构建出intent的“意图”
// intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
// //调用Intent中的addCategory() 方法来添加一个category
//
// startActivity(intent);//启动活动
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重写
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //构建出intent的“意图”
// startActivity(intent);//启动活动
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通过调用setOnClickListener() 方法为按钮注册一个监听器
// //点击按钮时就会执行监听器中的onClick() 方法。
// @Override //表示重写
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
// //通过静态方法makeText() 创建出一个Toast对象
// //并通过show()将Toast显示出来
//
// // makeText() 方法需要传入3个参数。
// // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
// // 第二个参数是Toast显示的文本内容,
// // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
有: