启动活动页面
Activity的启动和结束
从当前页面跳转到新页面,跳转代码如下:
startActivity(new Intent(源页面.this,目标页面.class);
从当前页面回到上一个页面,相当于关闭当前页面,返回代码如下:
finish();//结束当前活动页面
代码示例
创建两个页面然后进行页面的跳转,首先创建一个ActStartActivity作为主页面,ActFinishActivity作为目标页面,在ActStartActivity中设置按钮跳转到ActFinishActivity,故需要对该按钮实施监听,在ActFinishActivity中也设置一个按钮让完成跳转后点击该按钮,从目标页面跳转到原页面
//ActStartActivity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
>
<Button
android:id="@+id/btn_act_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转到下一个页面"></Button>
</LinearLayout>
package com.example.chapter04;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_act_start);
Button btn_act_next = findViewById(R.id.btn_act_next);
btn_act_next.setOnClickListener(this);
}
@Override
public void onClick(View view) {
startActivity(new Intent(this,ActFinishActivity.class));
}
}
//ActFinishActivity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ImageView
android:id="@+id/iv_back"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/sqrt"></ImageView>
<Button
android:id="@+id/btn_finish"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="完成"
></Button>
</LinearLayout>
package com.example.chapter04;
import android.os.Bundle;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_act_finish);
findViewById(R.id.btn_finish).setOnClickListener(this);
findViewById(R.id.iv_back).setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId() == R.id.iv_back || view.getId() == R.id.btn_finish){
finish();
}
}
}
Activity的生命周期
onCreate:创建活动,把页面布局加载进内存里,进入初始化状态
onStrat:开始活动。把活动页面显示在屏幕上,进入就绪状态
onResume:恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作,允许用户输入文字
onPause:暂停活动。页面进入暂停状态,无法与用户正常交互
onStop:停止活动。页面将不在屏幕上显示
onDestory:销毁活动。回收活动占用的系统资源,把页面从内存中清除
onRestart:重启活动。重新加载内存中的页面数据
onNewIntent:重用已有的活动实例
如果一个Activity已经启动过时,并且存在当前应用的Activity任务栈中,启动模式为singleTask,singleInstance或singleTop(此时已在任务栈顶),那么在此启动或回到这个Acticity的时候,不会创建新的实例,也就是不会执行onCreate方法,而是执行onNewIntent方法。
Activity生命周期的过程
1、OnCreate()
当Activity首次创建时调用
作用:初始化界面,设置布局,进行一次性初始化操作(例如设置监听,绑定视图等)
典型操作:setContentView(),绑定视图控件,设置数据
2、Onstart()
在onCreate()之后,或者当Activity从不可见状态变为可见时调用
作用:表示Activity即将变得可见,但用户还无法进行进行交互
3、OnResume()
当Activity准备好与用户交互时调用,表示Activity已经位于前台且可以处理用户输入
作用:Activity完全可见,并且在用户可交互状态
典型操作:启动动画,恢复视频播放等需要用户交互的操作
4、onPause()
当Activity即将离开前台时调用
作用:释放不必要的资源,暂停动画或保存临时数据(比如:视频暂停、数据存储等)。
典型操作:释放与UI相关的资源、停止动画或视频等不必要的操作,避免影响性能。
5、OnStop()
当Activity完全不可见时调用。
作用:释放更重的资源,如注销广播接收器或关闭可能占用大量资源的操作。
典型操作:释放不必要的资源、保存状态数据或取消资源密集的操作(如网络请求)。
6、OnRestart
当Activity从停止状态重新启动时调用,一般是在onStop()之后再次恢复时。
作用:通常用于恢复Activity时做准备工作(例如:重新加载数据或资源)。
典型操作:恢复被停止的操作或重新初始化某些内容。
7、OnDestory
当Activity被销毁时调用,可能是因为用户退出Activity或系统终止该Activity以释放内存。
作用:释放所有资源、终止后台任务等,确保没有内存泄漏。
典型操作:彻底清理资源、关闭所有后台进程。
生命周期的关键点
启动阶段:onCreate() → onStart() → onResume(),此时Activity已完全准备好,用户可以与之交互。
暂停与恢复:当Activity从前台进入后台时,系统会依次调用onPause()、onStop()。当用户再次返回到Activity时,调用onRestart() → onStart() → onResume()。
销毁阶段:如果用户退出或系统回收资源,Activity会调用onPause() → onStop() → onDestroy()。
生命周期示意图
onCreate() -> onStart() -> onResume() -> (Activity active)
-> onPause() -> onStop() -> onDestroy() (Activity ends)
-> onRestart() -> onStart() -> onResume() (Activity resumes)
Activity的启动模式
默认启动模式
该模式可以被设定,不在manifest设定时候,Activity的默认模式就是standard。在该模式下,启动该的Activity会依次压入Task栈中:
模拟如下
StartActivity1->Activity1会压入栈顶,StartActivity2->Activity2会压入栈顶
再StartActivity2->这个时候虽然Activity2在栈顶但是不会去复用,所以新的Activity2会压入栈顶
退出的话就是栈中的元素按照先进后出的原则依次消除Activity
栈顶复用模式singleTop
在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity
模拟如下
StartActivity1->将Activity1压入栈顶,StartActivity2->将Activity2压入栈顶,
当再次StartActivity2的时候由于此时Acticity2在栈顶,
相对于Standard的启动模式,
这里不会去生成新的Activity2,而是去复用栈顶的Activity2
但是如果此时要调用到Activity1,这里仍然会生成一个新的对象入栈
因为虽然Activity1在栈中但是在栈底
栈顶复用模式的应用场景
适合开启渠道多,多应用开启调用的Activity,通过这种设置可以避免已经创建过的Activity被重复创建,多数通过动态设置使用。
栈内复用模式singleTask
与singleTop模式相似,只不过singleTop模式是只是针对栈顶元素,而singleTask模式下,如果task栈内存在目标Activity实例,则将task内对应Activity实例之上的所有Activity弹出栈,并将对应Activity置于栈顶,获取焦点
模拟过程如下
开始StartActivity1->将Activity1压入栈中
再StartActivity2->将Activity2压入栈中
StartActivity3->将Activity3压入栈中
然后现在再StartActivity1,此时因为栈内存在目标Activity
根据singleTask模式,此时会把Activity3,Activity2依次出栈
出栈后此时Activity1属于栈顶,就可以直接使用
singleTask应用场景
程序主界面:我们不希望主界面被创建多次,而且在主界面退出的时候退出整个App是最好的效果
耗费系统资源的Activity:对于那些及其耗费系统资源的Activity,我们可以考虑将其设为singleTask模式,减少资源耗费
全局唯一模式singleInstance
在该模式下,我们会为目标Activity创建新的TaskStack,将目标Activity放入新的Task,并让目标Activity获取焦点,新的Task有且只有一个Activity实例。如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒
模拟过程如下:
StartActivity1->此时会生成一个TaskStack专门存放Activity1
StartActivity2->此时会生成一个新的TaskStack专门存放Activity2
要用哪个就从哪个里面取
动态设置启动模式
Intent.FLAG_ACTIVITY_NEW_TASK:开辟一个新的任务栈
Intent.FLAG_ACTIVITY_SINGLE_TOP:当栈顶为待跳转的活动实例之时,则重用栈顶的实例
Intent.FLAG_ACTIVITY_CLEAR_TOP:当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例以上的所有实例
Intent.FLAG_ACTIVITY_NO_HISTORY:栈中不保存新启动的活动实例
Intent.FLAG_ACTIVITY_CLEAR_TASK:跳转到新页面时,栈中的原有实例都被清空
运用动态启动模式的例子
很多APP第一次打开都要求用户登录,登录成功再进入APP首页,如果这时按下返回键,发现并没有回到上一个登录页面,而是直接退出APP了,原因是因为登录成功后,APP便记录下用户的登录信息,接下来默认该用户是登录状态,自然不必重新输入用户信息,既然默认用户登录了,哪里还需要回到登录页面,不光是登录界面,登录之前的其他页面包括获取验证码,找回密码等界面都不应回去,每次登录成功之后,都不会回到登录界面了
登录页面的xml和java代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里是登录成功页面,登录成功之后不必返回登录验证页面。请按返回键 " />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里是登录验证页面,此处省略了用户名和密码等输入框" />
<Button
android:id="@+id/btn_jump_success"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="跳转到登录成功页面" />
</LinearLayout>
package com.example.chapter04;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class LoginInputActivity extends AppCompatActivity implements View.OnClickListener {
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_login_input);
findViewById(R.id.btn_jump_success).setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent = new Intent(this, LoginSuccessActivity.class);
//设置启动标志:跳转到新页面,栈中的原有实例都被清空,同时开辟新任务的活动栈
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
//登录成功页面的xml和java代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里是登录成功页面,登录成功之后不必返回登录验证页面。请按返回键 "/>
</LinearLayout>
package com.example.chapter04;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class LoginSuccessActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_login_success);
}
}
例子的逻辑和问题
1、代码的逻辑就是用户登录成功跳转到登录成功的页面之后,当用户返回时,不会再跳转到原来的登录界面,而是直接关闭掉登录跳转的页面和登录成功的页面
FLAG_ACTIVITY_CLEAR_TASK:会清空当前任务栈中所有的活动(包括登录页面LoginInputActivity)
FLAG_ACTIVITY_NEW_TASK:会在新的任务栈中启动LoginSuccessActivity,并且这个活动成为栈中第一个活动。因为这就是为什么当用户返回不会去回到登录页面而是直接退出返回到桌面。
2、如果不使用动态启动模式
系统就会按照默认的启动模式来处理活动和启动和管理栈
也就是说不会清空任务栈
当用户从LoginInputActivity跳转到LoginSuccessActivity时,LoginInputActivity仍在任务栈里面
按钮的效果
当用户进入 LoginSuccessActivity 后,如果按下返回键,系统会将 LoginSuccessActivity 销毁,并返回到之前的 LoginInputActivity。
这意味着用户会回到登录页面,看到登录输入界面,可能导致重复登录操作。
在活动之间传递信息
显式Intent和隐式Intent
Intent是各组件之间信息沟通的桥梁,它用于Android各组件之间的通信,主要完成下列工作:
1、标明本次通信请求从哪里来,哪里去,要怎么走
2、发起方携带本次通信需要的数据内容,接收方从收到的意图中解析数据
3、发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容
Intent组成部分
显式Intent
直接指定来源活动与目标活动,属于精确匹配
在构建一个意图对象时,需要指定两个参数,第一个参数表示跳转的来源页面,即来源Activity.this,第二个参数表示 待跳转的页面,即目标Activity.class具体的意图构建方式有如下三种方法
//1、在Intent构造函数中指定
Intent intent = new Intent(this,ActNextActivity.this);
//2、调用意图对象的setClass方法指定
Intent intent = new Intent();
intent.setClass(this,ActNextActivity.class);
//3、调用意图对象的setComponent方法指定
Intent intent = new Intent();
//创建包含目标活动在内的组件名对象
ComponentName component = new ComponentName(this,ActNextActivity.class);
intent.setComponent(component); //设置意图携带的组件信息
隐式Intent
没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配
通常App不希望向外部暴露活动名称,只给出一个事先定义好的标记串,这样大家约定俗成,隐式Intent便起到了标记过滤作品。这个动作名称标记串,可以是自动定义的作品,也可以是已有的系统动作。常见系统动作的取值说明表
action和category是隐式intent的重要组成,决定了intent传递的意图和范围
Action:是一个字符串常量,代表一个操作的具体含义,用来启动不同的功能
category是用来指定Intent可以匹配的环境类型,Andorid组件可以处理一个或者多个类别的Intent,
如果指定了某个类别,只有具有该类别的组件才能接收该Intent
Intent.CATEGORY_DEFAULT: 表示一个Activity可以作为默认的启动对象使用。所有隐式Intent必须至少包含这一项
Intent.CATEGORY_BROWSABLE: 表示Intent可以从浏览器中启动
Intent.CATEGORY_LAUNCHER: 表示Activity可以作为启动器中的一个条目显示
向下一个Activity发送数据
Intent使用Bundle对象存放待传递的数据信息
Bundle对象操作各类型数据的读写方法说明如下图
Bundle在代码中发送消息包裹,调用意图对象的putExtras方法,即可存入消息包裹
Bundle在代码中接收消息包裹,调用意图对象的getExtras方法,即可取出消息包裹
创建Intent对象: 在当前Activity中,创建一个Intent对象,用于启动目标Activity。
添加数据到Intent: 使用putExtra()方法将数据存储到Intent中。你可以传递不同类型的数据,如字符串、整数、布尔值、数组甚至对象(对象需要实现Serializable或Parcelable接口)。
启动目标Activity: 使用startActivity()方法启动目标Activity,传递包含数据的Intent。
在目标Activity中接收数据: 在目标Activity的onCreate()方法中,调用getIntent()获取启动它的Intent对象,并使用getExtras()或get<Type>Extra()方法来提取数据。
//传数据Activity
Intent intent = new Intent(this,.cls);
intent.putExtra("username","cxf");
intent.putExtra("age",111);
startActivity(intent);
//接收数据
Intent intent = new Intent();
String username = intent.getStringExtra("username"); // 获取字符串
int age = intent.getIntExtra("age", 0); // 获取整数
//显示
TextView textView = findViewById(R.id.textView);
textView.setText("Username: " + username + ", Age: " + age);
向上一个Activity返回数据
处理下一个页面的响应数据的步骤:
1、上一个页面打包好请求数据,调用StartActivityResult方法执行跳转动作
2、下一个页面接收并解析请求数据,进行相应处理
3、下一个页面在返回上一个页面时,打包应答数据并调用setResult方法返回数据包裹
4、上一个页面重写方法onActivityResult,解析获得下一个页面的返回数据
案例
ActRequestActivity启动ActResponseActivity并发送一条“请求”消息。
ActResponseActivity接收该请求消息后,准备一条“响应”消息。
ActResponseActivity将这条“响应”消息返回给ActRequestActivity,并显示在界面上。
在ActRequestActivity中启动目标Activity,并接收返回数据
注册ActivityResultLauncher: 在ActRequestActivity的onCreate()方法中,使用registerForActivityResult()注册一个ActivityResultLauncher,用于启动ActResponseActivity并接收返回的数据
register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), o -> {
if(o != null){
Intent intent = o.getData();
if(intent != null && o.getResultCode() == Activity.RESULT_OK){
Bundle bundle = intent.getExtras();
String response = bundle.getString("response");
// 显示返回的消息
tv_response.setText(response);
}
}
});
ActivityResultContracts.StartActivityForResult:这是一个契约,用于启动一个Activity并等待返回的结果。
回调o.getResultCode() == Activity.RESULT_OK判断是否成功返回数据。
通过intent.getExtras()从返回的Intent中获取response数据并显示。
点击按钮启动ActResponseActivity并发送请求数据: 点击按钮时,通过Intent将“请求”消息传递给ActResponseActivity,并使用register.launch()启动目标Activity
@Override
public void onClick(View view) {
Intent intent = new Intent(this, ActResponseActivity.class);
// 创建包裹并传递数据
Bundle bundle = new Bundle();
bundle.putString("request:", mrequest);
intent.putExtras(bundle);
// 启动ActResponseActivity
register.launch(intent);
}
这里创建了一个Intent,通过putExtras()方法封装了一个Bundle对象,用于传递数据。
调用register.launch(intent)启动ActResponseActivity,等待其返回结果
在ActResponseActivity中接收请求并返回响应数据
接收ActRequestActivity传递的数据: 在ActResponseActivity的onCreate()方法中,通过getIntent().getExtras()接收传递过来的数据,并显示在界面上。
Bundle bundle = getIntent().getExtras();
String request = bundle.getString("request");
tv_request.setText(request); // 显示收到的请求消息
返回数据给ActRequestActivity: 当用户点击“返回”按钮时,通过Intent封装一条“响应”消息,并调用setResult()返回数据给上一个Activity。
@Override
public void onClick(View view) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("response", response);
intent.putExtras(bundle);
// 返回结果给上一个页面
setResult(ActResponseActivity.RESULT_OK, intent);
// 结束当前页面
finish();
}
总体流程
ActRequestActivity:
注册ActivityResultLauncher以启动ActResponseActivity并接收返回结果。
点击按钮时,启动ActResponseActivity并发送请求消息。
接收到ActResponseActivity返回的数据后,通过回调函数显示在界面上。
ActResponseActivity:
接收来自ActRequestActivity的请求消息,并显示。
点击按钮时,设置返回数据并通过setResult()将“响应”消息返回给ActRequestActivity
为活动补充附加信息
利用资源文件配置字符串
在res->values->string中添加字符串
xml文件中引用是@string/(字符串名字)
在java中引用是getString(R.string.字符串名)
利用元数据传递配置信息
步骤分三步
调用getPackageManager方法获得当前应用的管理器
调用包管理器的getActivityInfo方法获得当前活动得信息对象
活动信息对象得mateData是Bundle包裹类型,调用包裹对象的getString即可获得指定名称的参数值
TextView tv_meta = findViewById(R.id.tv_meta);
//获取包管理器
PackageManager packageManager = getPackageManager();
try {
//从应用包管理器中获取当前活动信息
ActivityInfo info = packageManager.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
//获取活动附加的元数据信息
Bundle metaData = info.metaData;
String weather = metaData.getString("weather");
tv_meta.setText(weather);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
使用场景
元数据的使用场景很多,比如:
- 全局配置信息:像API密钥或某些全局设置,可以通过
application
级别的元数据进行配置。 - 组件特定配置:例如某个
Activity
或Service
需要特定的配置项,可以通过组件级别的meta-data
进行设置。
给应用页面注册快捷方式
通过元数据配置快捷菜单的步骤:
1、在AndroidManifest.xml中添加元数据
<activity android:name=".ActStartActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
</activity>
2、在res目录下创建xml文件夹再创建shortcuts.xml文件
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="first"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/first_short"
android:shortcutLongLabel="@string/first_long">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.chapter04"
android:targetClass="com.example.chapter04.ActStartActivity"/>
<categories android:name="android.shortcut.conversation"/>
</shortcut>
<shortcut
android:shortcutId="second"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/second_short"
android:shortcutLongLabel="@string/second_long">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.chapter04"
android:targetClass="com.example.chapter04.JumpFirstActivit"/>
<categories android:name="android.shortcut.conversation"/>
</shortcut>
<shortcut
android:shortcutId="third"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/third_short"
android:shortcutLongLabel="@string/third_long">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.chapter04"
android:targetClass="com.example.chapter04.LoginInputActivity"/>
<categories android:name="android.shortcut.conversation"/>
</shortcut>
</shortcuts>
/***
shortcutId:每个快捷方式的唯一标识符。
enabled:设置为 true 启用快捷方式。
icon:显示在快捷方式上的图标。
shortcutShortLabel:短标签,显示在快捷方式旁边。
shortcutLongLabel:长标签,长按快捷方式时会显示。
intent:定义快捷方式点击时的动作,通常通过 Intent 跳转到特定 Activity。
targetPackage 和 targetClass:指定目标应用和目标 Activity。
3、字符串资源文件中的快捷方式标签
在res/values/strings.xml中定义快捷方式和长短标题
标签:安卓,Bundle,Intent,Activity,import,intent,页面 From: https://blog.csdn.net/Simple_liv_/article/details/142352103