案例展示:
Activity的生命周期 7个回调方法
onCreate()创建
onStart()启动
onResume()恢复
onPause()暂停
onStop()停止
onDestroy()销毁
onRestart()重启
单个Activity的生命周期
1.正常启动 onCreat->onStart->onResume,正常退出onPause->onStop->onDestory,
再次启动onCreat->onStart->onResume
2.已经处于前台的Activity,点击主页按钮离开当前Activity,onPause->onStop,
回到Activity:onRestart->onStart->onResume
3.Activity不可操作onPause->onStop(如:息屏,打开其他Activity),而应用被强行杀死了,
再回到Activity,onCreat->onStart->onRestart
4.多个Activity切换时
当启动另外一个Activity时,当前的Activity:onPause->onStop,当点击返回按钮,
使另一个Activity退出时,当前Activity:onRestart->onStart->onResume
5.对话框存在时
–普通对话框对生命周期没有任何影响
–如果有伪装Activity对话框模式,那么当它启动时,之前的Activity:onPause
对话框消失后,回调onResume再回到前台
Activity启动方式 3大方式
–显示启动 (常规的启动方式 编译器知道要启动的Activity界面)
–隐式启动 (编译器并不知道要启动哪个Activity界面,隐式启动使用方法在案例里,一般这个系统还是用于启动系统应用更多一点)
–StartActivityForResult (带返回的启动Activtiy)
//参2 填写requestCode状态码
//如果通过startActivityForResult的方式启动第二个Activity处理结束后,再回到当前Activity时,
//一定会自动回调onActivityResult方法
//在该方法中我们处理第二个Activity返回的结果(如:拍照得到的照片,从图库中选取的图片等)
案例代码:
MainActivity.java
Main2Activity.java
DialogActivity.java
Student.java
activity_main.xml
activity_main2.xml
===代码区
- MainActivity.java
package com.example.myapplicationactivity;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
public void myclick(View view) {
switch (view.getId()){
case R.id.btn1://启动第二个Ativity
//Integer 意图 参1环境上下文,当前环境this 当前Activity的对象this 参2待跳转的Activity的类对象
Intent it = new Intent(this,Main2Activity.class);
startActivity(it); //启动Activity
break;
case R.id.btn2://打开一个普通对话框,普通对话框不会影响生命周期
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示")
.setMessage("打开一个对话框,遮住Activity,观察生命周期的变化")
.setPositiveButton("确定",null) //对话框的按钮操作
.show(); //显示对话框
break;
case R.id.btn3: //界面对话框 界面(本质)对话框(形式)
//帮DialogActivity做成弹出对话框一样的 只遮住部分界面外观
//到清单文件中<activity android:name=".DialogActivity" android:theme="@style/Theme.AppCompat.Dialog"></activity>
Intent it2 = new Intent(this,DialogActivity.class);
startActivity(it2); //启动Activity
break;
case R.id.btn4://隐式启动系统Activity
//参数1 action:是Activity的别名 是字符串
//参数2 Uri对象,打开的路径,可以通过协议来具体打开什么Actitvity (http协议就是打开浏览器)
//(如果是tel:13141515151打开的电话协议)
Intent it3 = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(it3);
break;
case R.id.btn5://隐式启动普通Activity
//参数1 action:是Activity的别名 是字符串
Intent it4 = new Intent("abc");
startActivity(it4);
break;
/* 修改清单代码
<activity android:name=".Main2Activity">
<!--意图过滤器 第一个action名字可以随意起 category按照系统给的最后改到DEFAULT下面-->
<intent-filter>
<action android:name="abc" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
*/
case R.id.btn6:
Intent it5 = new Intent(this,Main2Activity.class);
//参2请求码 创建onActivityReenter方法
startActivityForResult(it5,1000);
break;
case R.id.btn7:
Intent it6 = new Intent(this,Main2Activity.class);
it6.putExtra("msg1","这是数据1");
it6.putExtra("msg2",100);
//然后到启动的Main2Activity取出数据Intent it = getIntent(); 调用it.getStringExtra
startActivity(it6);
break;
case R.id.btn8:
//创建一个类 并要添加序列化接口 implements Serializable 网络中传递一个类必须要序列化操作
Student stu1 = new Student("张三",14,"男");
Intent it7 = new Intent(this,Main2Activity.class);
it7.putExtra("stu1",stu1);
//然后到启动的Main2Activity获取序列化对象Student stu1 = (Student) it.getSerializableExtra("stu1");
//
startActivity(it7);
break;
}
}
//如果通过startActivityForResult的方式启动第二个Activity处理结束后,再回到当前Activity时,
//一定会自动回调onActivityResult方法
//在该方法中我们处理第二个Activity返回的结果(如:拍照得到的照片,从图库中选取的图片等)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//requestCode 返回码 一般用于区分该结果来自哪个Activtiy 比如拍照返回1001 图库返回1002
//resultCode 就是结果码
//resultCode:0 ,RESULT_CANCE 取消 | -1,RESULT_OK 正确处理完后返回(我们在调用的Main2Activity做测试)
//参数3 返回的数据(在Main2Activity的setResult中参数2设置了Intent数据对象)
Log.e("TAG","自动进入了onActivityResult,requestCode="+requestCode+",resultCode:"+resultCode);
if (resultCode ==RESULT_OK){
Log.e("TAG","返回值是RESULT_OK");
Log.e("TAG","返回的数据是:"+data.getStringExtra("myMsg"));
}
}
//创建方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("TAG","onCreate----------创建");
}
//启动
@Override
protected void onStart() {
super.onStart();
Log.e("TAG","onStart----------启动");
}
//恢复
@Override
protected void onResume() {
super.onResume();
Log.e("TAG","onResume----------恢复");
}
//停止
@Override
protected void onPause() {
super.onPause();
Log.e("TAG","onPause----------暂停");
}
//暂停
@Override
protected void onStop() {
super.onStop();
Log.e("TAG","onStop----------停止");
}
//销毁
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("TAG","onDestroy----------销毁");
}
//重启
@Override
protected void onRestart() {
super.onRestart();
Log.e("TAG","onRestart----------重启");
}
}
Main2Activity.java
package com.example.myapplicationactivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//如果要获取上一个界面传来的数据,那么首先要获取做启动的意图
Intent it = getIntent();
String msg1 = it.getStringExtra("msg1");
int msg2 = it.getIntExtra("msg2",0);//int要给参2默认值0即可
TextView txt = findViewById(R.id.txt);
txt.setText(msg1+" "+msg2);
//获取序列化对象并传输测试对象
TextView txt1 = findViewById(R.id.txt1);
Student stu1 = (Student) it.getSerializableExtra("stu1");
if (null != stu1){
txt1.setText(stu1.getName() + stu1.getAge() + stu1.getGender());
}
//对文本添加点击事件完成对返回结果码操作
findViewById(R.id.txt).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent it = new Intent(); //此时的意图不作为跳转界面使用,而是用来传递数据
it.putExtra("myMsg","这是来自第二界面的信息");
//设置结果
//参2 结果码,在上一个界面的onActivityResult方法中通过resultCode获取
// 参1存放Intent数据对象 在上个onActivityResult方法中通过data获取
//
setResult(RESULT_OK,it);
finish();
}
});
}
}
DialogActivit.java
package com.example.myapplicationactivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class DialogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
Student.java
package com.example.myapplicationactivity;
import java.io.Serializable;
//序列化implements Serializable
//1,想把内存中的对象保存到一个文件或数据库中时
//2,像利用套接字Socket在网络中传递对象
public class Student implements Serializable {
private String name;
private int age;
private String gender;
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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
}
activity_main.xml
<?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"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn1启动新的Activity"
android:onClick="myclick"
/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn2打开一个对话框"
android:onClick="myclick"
/>
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn3打开界面对话框"
android:onClick="myclick"
/>
<Button
android:id="@+id/btn4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn4隐式启动系统Activity(打开浏览器)"
android:onClick="myclick"
/>
<Button
android:id="@+id/btn5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn5隐式启动普通Activity"
android:onClick="myclick"
/>
<Button
android:id="@+id/btn6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn6带返回结果启动Activity"
android:onClick="myclick"
/>
<Button
android:id="@+id/btn7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn7启动新的Activity并传递数据"
android:onClick="myclick"
/>
<Button
android:id="@+id/btn8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn8传递对象数据"
android:onClick="myclick"
/>
</LinearLayout>
activity_main2.xml
<?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"
tools:context=".Main2Activity">
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二个Activity"/>
<TextView
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>