学习code:MainActivity:
https://github.com/liuyan2010/android_learn.git
主要内容:
Activity生命周期
Intent使用:
- Activity跳转
- 传递参数/对象
- Activity反向传递数据
- Activity再次启动时,之前数据不丢失
Activity四种启动模式(存储栈方式分析)
app监控Activity操作
Activity生命周期
Activity 类定义了下面的回调:
回调 描述
- onCreate() 这是第一个回调,在活动第一次创建时调用
- onStart() 这个回调在活动为用户可见时被调用
- onResume() 这个回调在应用程序与用户开始可交互的时候调用
- onPause() 被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用
- onStop() 当活动不在可见时调用
- onDestroy() 当活动被系统销毁之前调用
- onRestart() 当活动被停止以后重新打开时调用
App demo示例:
package com.example.activity_test;
import androidx.appcompat.app.AppCompatActivity;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
String msg = "TEST:";
private Button bt1;
@Override
/** 当活动第一次被创建时调用 */
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
bt1 = findViewById(R.id.button001);
bt1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
}
});
}
/** 当活动即将可见时调用 */
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "The onStart() event");
}
/** 当活动可见时调用 */
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "The onResume() event");
}
/** 当其他活动获得焦点时调用 */
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "The onPause() event");
}
/** 当活动不再可见时调用 */
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "The onStop() event");
}
/** 当活动将被销毁时调用 */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "The onDestroy() event");
}
}
执行结果:
打开app
- onCreate()
- onStart()
- onResume()
将app放到后台/或者界面跳转
- onPause()
- The onStop()
将app退出
- onPause()
- onStop()
- onDestroy()
销毁一个Activity——finish()
Toast使用:
Toast.makeText(getApplicationContext(), "You are OK",Toast.LENGTH_SHORT).show();
Intent使用,数据传递保存
跳转操作:
显式Intent:对于明确指出了目标组件名称的Intent,我们称之为显式Intent
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
隐式Intent:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent
Android系统寻找与Intent请求意图最匹配的组件具体的选择方法 是:Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
AndroidManifest.xml
action配置:包名+项目名+自定义名
category配置:默认写成android.intent.category.DEFAULT即可
<intent-filter>
<action android:name="com.example.activity_test.ACTION_START001" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
MainActivity.java
Intent intent = new Intent();
intent.setAction("com.example.activity_test.ACTION_START001");
startActivity(intent);
Intent传递参数
一般的传递操作:
MainActivity.java
double PI = 3.1415926;
intent.putExtra("PI", PI); //可传各种类型参数
Main2Activity.java
double PI = getIntent().getExtras().getDouble("PI");
使用Bundle传递多个参数
MainActivity.java
Bundle bundle = new Bundle();
bundle.putDouble("PI", 3.1415926);
intent.putExtras(bundle);
接收方式不变,不需要修改
传递对象操作(将对象序列化,传递后恢复):
Bundle bundle = new Bundle();
bundle.putSerializable("user", user); // key,value
intent.putExtras(bundle);
注意:user类需要实现serialable接口
接收对象:
user=(User)intent.getSerializableExtra("user");
数据反向传递
一个Activity可能包含多个按钮,每个按钮跳转至不同的Activity处理不同的业务,这些跳转后的Activity关闭后又要返回跳转前的Activity并返回数据怎么办?
使用方法:
startActivityForResult(Intent intent, int requestCode)
接收方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//使用requestCode判定是哪一个Activity返回,接收数据,执行相关操作
}
数据保存不丢失
保存Activity的信息:例如在Activity1输入一些信息,跳转到Activity2,如果Activity1被回收了,再次返回时,Activity1信息需要重新输入,比较麻烦。
重写方法onSaveInstanceState:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//outState是一个bandle,存储数据即可
}
在OnCreate里直接将数据拿出来即可:
if(savedInstanceState != null){
savedInstanceState.getString(“key”); //获取数据
}
Activity的四种启动模式
Android使用返回栈来管理Activity
android:launchMode="singleTop" //修改xml即可
standard:每次创建新的Activity到栈顶。
singleTop:创建之前检查栈顶Activity是否为需要的Activity,如果是直接使用,否则创建
singleTask:创建之前从栈里面寻找Activity,如果存在直接将该Activity之前的全部出栈,使用该Activity,否则创建新的。
singleInstance:特殊情况使用,供其他app调用。创建一个新的返回栈,可以供多个程序调用
app程序全局维护监测
程序app维护监测,确认当前在哪一个Activity执行:
写一个Base类,让其他的Activity都去继承这个Base类即可:
public class BaseActivity extends AppCompatActivity {
String Tag = "BaseActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(Tag, getClass().getSimpleName()); //打印标签和Activity名
}
}
随时随地的退出程序
创建一个单例类,可以对所有的Activity进行finish操作
public class ActivityControler {
private static ArrayList<Activity> activities;
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for (Activity activity : activities){
if (!activity.isFinishing())
activity.finish();
}
activities.clear();
}
}
在每个Activity里面执行:ActivityControler.addActivity(this); //存储Activity