案例展示:

android 解决activity重启 activity重载7个方法_ide

Activity的生命周期 7个回调方法

onCreate()创建

onStart()启动

onResume()恢复

onPause()暂停

onStop()停止

onDestroy()销毁

onRestart()重启

android 解决activity重启 activity重载7个方法_java_02


android 解决activity重启 activity重载7个方法_java_03

单个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>