Android活动"/>
Android活动
什么是活动:
原名叫Activity,安卓中最常用的组件之一,为用户提供了一个交互的界面,用于动画,图像的显示。
活动如何使用:
在Android Studio中创建一个java类,继承AppCompatActivity类,重写onCreate方法,并在其中引用xml布局文件,此时,一个简单的活动就写好了,只是这个时候还没有任何界面显示。需要在xml文件中编写界面。
一,活动的生命周期:
活动的生命周期就是,活动本身在安卓程序中存在的时间。
谷歌将整个生命周期分为了三大阶段:
1.创建阶段:
期间执行onCreate()方法,此方法中进行活动的初始化操作,如设置布局、绑定控件、获取数据
2.可见阶段
onStart()方法和onResume()方法
3.暂停阶段
onStop(),此时界面依旧可见,只是失去焦点,可以在此方法中保存临时数据或释放资源,以便在后续恢复时使用。
4.停止阶段
onStop(),此时活动已经不可见,不可以和用户进行界面交互,可以在此方法中释放更多资源,以及处理一些界面的重置操作。
5.销毁阶段
onDestroy(),此方法中活动被完全销毁,释放所有资源,断开与数据库的连接
几个生命周期之间也可以进行转化,
由onPause() ---> onResume(),onStop() --执行onRestart()--> onStart(),
当按下home键的时候,活动不可见,但是并没有被销毁,所以执行到onStop()方法,也就是一次执行onPause()和onStop()。
按下back键的时候,活动不可见,但并未被销毁,所以同上
当杀死这个进程的时候,活动就会执行onDestroy()方法 。
我们打上日志,看看执行
package com.example.activity;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;public class ActStartActivity extends AppCompatActivity {public static final String TAG = "wang";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_act_start);}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, "onStart");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");}
}
二,活动的启动模式:
每一种启动模式都可以在java代码中和列表清单文件中进行设置launchMode中设置
1.默认模式:
①xml
在activity节点中,将属性launchMode设置为"standard",或者不设置,,默认为标准
android:launchMode="standard"
②java代码
可以设置点击事件,使用intent意图打开下一个活动的时候设置setFlags();设置
Intent in = new Intent();in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
意为创建一个新的活动,如果不存在活动栈,就会重新创建一个活动栈。
2.栈顶复用模式:
①xml
将同一个属性设置为
android:launchMode="singleTop"
②java代码
Intent in = new Intent();in.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
当活动本身处于栈顶的时候,如果再一次需要进入此活动,就会直接使用栈顶的
例子:
如果你已经打开了一个应用程序的界面,此时点击home,然后再一次,不会再次创建活动,而是直接使用你现在已经打开的活动,继续使用栈顶的活动,并使其可视化。
3.栈内复用模式:
①xml
android:launchMode="singleTask"
②java代码
Intent in = new Intent();in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
当任务栈里面存在多个活动的时候:
此时不会再创建新的活动2,而是检查栈中是否已经存在,如果存在,那么就会清空此活动上所有活动,是其成为栈顶,使用户可以看到,
我们使用例子,验证
例子:
思路:设置一个按钮,设置点击事件监听,如果点击按钮,就会创建一个活动2,如果,符合上述,那么在活动2再一次创建活动1的时候就会使最开始的活动1,再按返回就会退出
将活动1和活动2设置为栈内复用就可以
package com.example.activity;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class JumpFirstActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_jump_first);Button btn1 = findViewById(R.id.first_btn);btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent in = new Intent(JumpFirstActivity.this, JumpSecondActivity.class);//设置为栈内复用模式//也就是说此时的栈里面,只能存在一个活动的实例in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(in);}});}
}
package com.example.activity;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class JumpSecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_jump_second);Button btn2 = findViewById(R.id.second_btn);btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent in = new Intent(JumpSecondActivity.this, JumpFirstActivity.class);//设置为栈内复用模式//也就是说此时的栈里面,只能存在一个活动的实例in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(in);}});}
}
点击活动2的按钮之后,再按一下返回键,就会发现直接返回到了主界面
4.全局唯一模式:
它会运行在一个新的独立任务栈中,并且不与其他任务栈共享。如果任务栈中已存在 MyActivity
的实例,系统将返回该实例,而不会创建新的实例。这样可以确保 MyActivity
是全局唯一的,不会被其他活动所复用,且不与其他活动共存于同一个任务栈。
①xml
android:launchMode="singleInstance"
②java代码
Intent in = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_SINGLE_INSTANCE);
startActivity(intent);
将原有的栈清空,并重新创建一个栈,只有一个这活动。
例子:
常用于用户登录一款app的时候,登录完成之后,再按下返回键,就不会返回到登录界面,而是直接退出到了主界面。
三,活动之间传递数据:
1.向下一个活动发送数据:
向下一个活动传递数据的方式,通过Intent类。
①显示Intent
此处我们使用点击触发,开启下一个活动。
我们Bundle包装数据,使用意图Intent,传递到下一个活动
>创建一个Intent的对象,传入上下文,和下一个活动的.class
Intent in = new Intent();
//设置上下文
in.setClass(this, ActReceiveActivity.class);
>创建一个Bundle的对象,往里面放入数据,通过键值对的方式存储
Bundle b = new Bundle();
//向包裹里面装东西
b.putString("time", new Date().toString());
b.putString("content", "我喜欢你很久了");
>将Bundle放入Intent里面,
in.putExtras(b);
>打开下一个活动
startActivity(in);
有发送就有接收
下一个活动接受上一个传过来的数据:
>使用getIntent().getExtras()得到快递盒子Bundle
Bundle b = getIntent().getExtras();
String time = b.getString("time");
String content = b.getString("content");
//将包裹里面的String拼接起来
String src = String.format("发送时间:%s\n发送内容:%s\n",time,content);
tv.setText(src);
最后将String显示在想要显示的地方,此处使用TextView控件。
②隐式Intent
隐式intent常用于和软件上的其他应用的活动传递信息
使用隐式intent
>创建Intent对象
Intent in = new Intent();
>设置intent的动作action:
intent.setAction(Intent.ACTION_SEND);
在 Android 中,Intent 的动作(Action)是一个标识符,用于指定要执行的操作类型。以下是一些常用的 Intent 动作:
-
ACTION_VIEW
: 显示指定数据的内容。例如,显示网页、图片、视频等。 -
ACTION_EDIT
: 编辑指定数据的内容。 -
ACTION_DIAL
: 拨打电话,需要在数据中指定电话号码。 -
ACTION_CALL
: 直接拨打电话,需要在数据中指定电话号码,需要权限。 -
ACTION_SEND
: 发送数据。例如,发送文本、图片、视频等。 -
ACTION_SENDTO
: 发送数据给指定接收者。 -
ACTION_PICK
: 从数据中选择一个项目。 -
ACTION_GET_CONTENT
: 选择特定类型的数据,例如图片或视频。 -
ACTION_CAMERA
: 打开相机应用。 -
ACTION_SEARCH
: 执行搜索操作。 -
ACTION_WEB_SEARCH
: 执行网络搜索操作。 -
ACTION_INSTALL_PACKAGE
: 安装应用程序。 -
ACTION_DELETE
: 删除数据。 -
ACTION_SEND_MULTIPLE
: 发送多个数据。 -
ACTION_MAIN
: 主要入口点,用于启动应用程序的主活动。
>设置Intent的数据类型
intent.setType("text/plain");
而intent可以设置的数据类型可以有很多
-
文本类型:
text/plain
: 纯文本类型,通常用于传递普通文本信息。text/html
: HTML 文档类型,用于传递包含 HTML 标记的文本信息。text/xml
: XML 文档类型,用于传递包含 XML 数据的文本信息。
-
图像类型:
image/jpeg
: JPEG 图像类型。image/png
: PNG 图像类型。image/gif
: GIF 图像类型。
-
音频类型:
audio/mpeg
: MPEG 音频类型,通常用于 MP3 音频文件。audio/wav
: WAV 音频类型,通常用于无损音频文件。
-
视频类型:
video/mp4
: MP4 视频类型,通常用于 MP4 视频文件。video/3gpp
: 3GP 视频类型,通常用于移动设备录制的视频。
-
应用程序类型:
application/pdf
: PDF 文档类型,通常用于传递 PDF 文件。application/zip
: ZIP 压缩类型,通常用于传递 ZIP 压缩文件。
>创建intent选择器
Intent chooser = Intent.createChooser(intent, "Select an app to share");
>放置数据或者使用setData方法
intent.putExtra(Intent.EXTRA_TEXT, "This is some text to share.");
或者
String PhoneNum = "123456789";
Uri uri = Uri.parse("tel:"+PhoneNum);
intent.setData(uri);
startActivity(intent);
>检查是否有可以处理该 Intent 的应用程序:
if (intent.resolveActivity(getPackageManager()) != null) {startActivity(chooser);
}
>启动intent
startActivity(intent);
2.向上一个活动发送数据:
分为下一个活动和上一个活动
同样我们设置一个按钮,并设置按钮点击监听,如果点击按钮,那么就会向上一个数据发送消息
①此活动(request)
>创建register注册对象
ActivityResultLauncher<Intent> register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {@Overridepublic void onActivityResult(ActivityResult result) {if (result != null) {Intent intent = result.getData();//获得从下一个活动传回来的数据if (intent != null && result.getResultCode() == Activity.RESULT_OK) {//如果回复是ok,意图不为空Bundle bundle = intent.getExtras();//取到快递盒子String response_time = bundle.getString("time");//根据key获得数据String response_content = bundle.getString("content");String desc = String.format("收到返回消息:\n应答时间为%s\n应答内容为%s", response_time, response_content);//将String放在一起重新编辑// 把返回消息的详情显示在文本视图上tv_response.setText(desc);}}}
});
>点击事件中设置数据
Intent in = new Intent(this, ActResponseActivity.class);
Bundle b = new Bundle();
b.putString("mss", mss);
in.putExtras(b);
register.launch(in);
将需要传递给下一个活动的数据打包,使用register.launch发送
②下一个活动(reponse)
>接受来自上一个活动的信息,详情看给下一个活动传递数据
Bundle b = getIntent().getExtras();
String src = b.getString("mss");
然后将信息打印在视图上
>通过点击事件传回数据:
Intent in = new Intent();
Bundle b = new Bundle();
//同样打包数据
b.putString("time", new Date().toString());
b.putString("content", ans);
in.putExtras(b);
//将结果回传回去
setResult(Activity.RESULT_OK, in);//来自继承父类的方法
finish();//结束掉此活动,就可以返回到上一个活动了
更多推荐
Android活动
发布评论