一、Activity 生命周期
package com.example.jony.activitydemo1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private String tag = MainActivity.class.getSimpleName();
/**
* Activity 被创建时
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(tag, "onCreate");
}
/**
* Activity 可见时执行
*/
@Override
protected void onStart() {
super.onStart();
Log.d(tag, "onStart");
}
/**
* Activity 重新可见时执行
*/
@Override
protected void onRestart() {
super.onRestart();
Log.d(tag, "onRestart");
}
/**
* Activity 可交互时执行
*/
@Override
protected void onResume() {
super.onResume();
Log.d(tag, "onResume");
}
/**
* Activity 被暂停时执行
*/
@Override
protected void onPause() {
super.onPause();
Log.d(tag, "onPause");
}
/**
* Activity 被停止时执行
*/
@Override
protected void onStop() {
super.onStop();
Log.d(tag, "onStop");
}
/**
* Activity 被销毁时执行
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(tag, "onDestroy");
}
}
- 应用启动时:
onCreate -->onStart -->onResume - 应用关闭时:
onPause -->onStop -->onDestroy - Activity被隐藏时:
onPause -->onStop
Activity 状态切换
- Activity从运行到停止:
onPause -->onStop - Activity从停止到运行:
onRestart -->onStart -->onResume - Activity从运行到暂停:
onPause - Activity从暂停到运行:
onResume - Activity从运行到断开:
onPause -->onStop -->onDestroy - Activity从断开到运行:
onCreate -->onStart -->onResume
屏幕翻转时
onPause -->onStop -->onDestroy -->onCreate -->onStart -->onResume
由于键盘隐藏或者屏幕翻转导致Activity被销毁重新创建,从而导致数据丢失,不想重新创建,则需要配置Activity
二、Activity之间传值
2.1 Intent方式
- 可以传递所有的Java 基本类型
- 传递对象(需要可序列化),对象接收可以直接get()获取基类,然后强转。
- 官方推荐的方式
传递
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(tag, "onCreate");
btn_tiaozhuan = (Button) findViewById(R.id.btn_tiaozhuan);
btn_tiaozhuan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intentOne = new Intent();
intentOne.setClass(MainActivity.this, ActivityOne.class);
intentOne.putExtra("str1","activity_main");
startActivity(intentOne);
}
});
}
接收
public class ActivityOne extends Activity {
private static final String TAG = "ActivityOne";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
Bundle bundle = getIntent().getExtras();
// String str1 = (String) bundle.get("str1");
String str1 = bundle.getString("str1");
Log.d(TAG, "str1: "+str1);
}
}
PS:传对象时两种方法
Parcelable Android 特有的序列化,存在内存的,程序结束,就会销毁,所以效率高
理论上不是很清楚
package com.example.jony.activitydemo1;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by jony on 17/8/3.
*/
public class ObjectOne implements Parcelable {
private String name;
private int age;
public ObjectOne() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
protected ObjectOne(Parcel in) {
name = in.readString();
age = in.readInt();
}
public static final Creator CREATOR = new Creator() {
//反序列化
@Override
public ObjectOne createFromParcel(Parcel in) {
// return new ObjectOne(in);
ObjectOne objectOne = new ObjectOne();
//顺序必须和writeToParcel中写的顺序相同
objectOne.setName(in.readString());
objectOne.setAge(in.readInt());
return objectOne;
}
@Override
public ObjectOne[] newArray(int size) {
return new ObjectOne[size];
}
};
@Override
public int describeContents() {
return 0;
}
//把参数序列化出去
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
}
}
Serializable 序列化存在本地的,适合持久化操作数据
两者使用时都要实现各自的接口
(Java 基础,写了占地)
2.2 静态变量方式
在需要传递参数的Activity 中声明一个公有的静态变量,传值时直接通过他的Activity类赋值就OK了,一般要记得在Activity 销毁时置为空。
注:不推荐这种方式,个人喜欢单类方式
2.3 剪切板方式
不知道为啥提这种方式,不推荐
2.4 全局对象方式
大家都知道,算是很实用的方式
创建一个Application的子类,在使用的时候,不需要创建实例,但要设置
2.4.1 一般简单的共享参数
package com.example.jony.activitydemo1;
import android.app.Application;
/**
* Created by jony on 17/8/3.
*/
//此类在应用程序启动时,会被系统创建
public class MyApplication extends Application {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//应用程序被创建,首先执行
@Override
public void onCreate() {
super.onCreate();
}
}
btn_tiaozhuan = (Button) findViewById(R.id.btn_tiaozhuan);
btn_tiaozhuan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intentOne = new Intent();
intentOne.setClass(MainActivity.this, ActivityOne.class);
// intentOne.putExtra("str1","activity_main");
MyApplication app = (MyApplication) getApplication();
app.setName("application name");
startActivity(intentOne);
}
});
2.4.2 Application单例
获取数据就不废话了,但要在其他类中正常使用,就要采用单例模式
package com.example.jony.activitydemo1;
import android.app.Application;
/**
* Created by jony on 17/8/3.
*/
//此类在应用程序启动时,会被系统创建
public class MyApplication extends Application {
private String name;
private static MyApplication instance;
public static MyApplication getInstance(){
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//应用程序被创建,首先执行
@Override
public void onCreate() {
super.onCreate();
this.instance = this;
}
}
使用
MyApplication app = MyApplication.getInstance();
2.4.3 HashMap传递
当共享的值比较多时,可以采用map
public class MyApplication extends Application {
private HashMap map = new HashMap();
private static MyApplication instance;
public static MyApplication getInstance(){
return instance;
}
public HashMap getMap() {
return map;
}
public void setMap(HashMap map) {
this.map = map;
}
//应用程序被创建,首先执行
@Override
public void onCreate() {
super.onCreate();
this.instance = this;
}
}
三、Activity 返回数据
同样可以采用上述方法,在采用intent方法时,启动Activity时要采用startActivityForResult(),敲不动了,贴几个来自我要自学网的视频截图
数据所在的Activity
接收数据的Activity,B方法就是回去Activity被销毁时,返回数据,而调用的
注:data判断,防止其他方式退出Activity,data为空而导致报错
3.1 请求码和结果码
- 请求码 用户自定义的整数,发出需要返回结果请求的Activity 的标识,标示请求源
- 结果码 返回结果的Activity的结果标识,标示结果源
package com.example.jony.activitydemo1;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private String tag = MainActivity.class.getSimpleName();
private Button btn_tiaozhuan1;
private Button btn_tiaozhuan2;
private TextView tv_return1;
private TextView tv_return2;
/**
* Activity 被创建时
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_tiaozhuan1 = (Button) findViewById(R.id.btn_tiaozhuan1);
btn_tiaozhuan2 = (Button) findViewById(R.id.btn_tiaozhuan2);
tv_return1 = (TextView) findViewById(R.id.tv_return1);
tv_return2 = (TextView) findViewById(R.id.tv_return2);
btn_tiaozhuan1.setOnClickListener(this);
btn_tiaozhuan2.setOnClickListener(this);
//
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_tiaozhuan1:
Intent intent1 = new Intent();
intent1.setClass(this, ActivityOne.class);
startActivityForResult(intent1, 1);
break;
case R.id.btn_tiaozhuan2:
Intent intent2 = new Intent();
intent2.setClass(this, ActivityTwo.class);
startActivityForResult(intent2, 2);
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
if (data == null)
return;
Bundle bundle = data.getExtras();
String str = bundle.getString("str");
//可以根据请求码或者结果码区分
switch (resultCode){
case 1:
tv_return1.setText(str);
break;
case 2:
tv_return2.setText(str);
break;
default:
break;
}
}
}
ActivityOne和ActivityTwo基本一样
public class ActivityOne extends Activity {
private static final String TAG = "ActivityOne";
private Button btn_destroy1;
private EditText et_str1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
btn_destroy1 = findViewById(R.id.btn_destroy1);
et_str1 = findViewById(R.id.et_str1);
btn_destroy1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent1 = new Intent();
intent1.putExtra("str","Activity1"+et_str1.getText());
setResult(1, intent1);
finish();
}
});
// Bundle bundle = getIntent().getExtras();
//// String str1 = (String) bundle.get("str1");
// String str1 = bundle.getString("str1");
// Log.d(TAG, "str1: "+str1);
}
}
四、Activity 启动模式
- standard
默认启动模式,每次激活Activity 时都会创建Activity 实例,并放入Activity 栈中 - singleTop
可以有多个实例,但不允许此Activity的实例叠加,即,如果此Activity 在栈顶有实例,启动这个Activity,不会创建新的实例,而会调用其onNewIntent()方法。如果不在栈顶,则创建新的实例。 - singleTask
只有一个实例,在同一个应用程序中启动它的时候,若不存在此Activity 实例,则会在当前栈中创建一个新的实例,若存在,则会把栈中在其之上的其他Activity 实例销毁掉,并调用此实例的onNewIntent 方法。如果在其他的应用程序中启动它,则会新建一个栈,并在栈中启动这个Activity,然后我在这个Activity 实例中再打开新的Activity ,这个新的Activity 实例会在一个栈中。 - singleInstance 只有一个实例,并且这个实例独立运行在一个Activity 任务栈(task)中,这个task只有这个实例,不允许有别的Activity 存在。
五、保存和恢复Activity状态
当屏幕旋转等操作导致Activity 重启,从而Activity 导致状态信息丢失,除过配置过id的控件(系统会调用Activity自身的onSaveInstanceState()和onRestoreInstanceState()保存恢复),没有配置id和其他的变量会丢失,如要保存,则需要自己在这两个方法中进行设置。
//保存Activity状态信息
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("string", string);
super.onSaveInstanceState(outState);
Toast.makeText(this, "onSaveInstanceState",Toast.LENGTH_SHORT).show();
}
//恢复状态
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState == null)
return;
String str = savedInstanceState.getString("string");
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
注:以及这种,上面有说明