赞
踩
之前博文《Android学习笔记之——activity》已经对Android开发的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是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景。本博文先介绍一下Intent启动活动
Intent有多个构造函数的重载,其中一个是
Intent(Context packageContext, Class<?>cls)
这个构造函数接收两个参数,
通过这个构造函数就可以构建出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并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的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,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得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> 标签中主要可以配置以下内容。
只有<data> 标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。不过一般在<data> 标签中都不会指定过多的内容,如上面浏览器示例中,其实只需要指定android:scheme 为http,就可以响应所有的http协议的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
- //
- // }
- // });
-
- }
- }
有:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。