Android学习——Activity

  • Activity生命周期
  • Activity启动模式

1. Activity生命周期
这里写图片描述
Activity主要有4种状态:活动、暂停、停止、死亡
7个方法:
onCreate创建
onStart开始
onStop停止
onRestart重新开始
onPause暂停
onResume继续
onDestroy销毁
说明:
(1) 启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
(2)当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
(3)当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
(4)当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
(5)用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
(6)当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
(7)用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
覆写Activity的7个方法,在方法中打印Log日志:

public class MainActivity extends Activity {
    private String tag = "mylog";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e(tag,"MainActivity------>onCreate");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.e(tag,"MainActivity------>onStart");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.e(tag,"MainActivity------>onResume");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.e(tag,"MainActivity------>onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.e(tag,"MainActivity------>onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(tag,"MainActivity------>onDestroy");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(tag,"MainActivity------>onRestart");
    }
}

情形1:
打开- - >直接back退出
onCreate- - >onStart- - > onResume - - > onPause - - > onStop - - > onDestroy
运行:
这里写图片描述
按back回退之后:
这里写图片描述
情形2:
打开 - - >home键- - >再打开
onCreate- - >onStart- - > onResume - - > onPause - - > onStop - - > onRestart- ->onStart- - > onResume

情形3:
通知栏拉下,Activity一直在运行状态

情形4:
弹出AlertDialog,无影响

情形5:
弹出PopupWindow,无影响

情形6:
弹出另一个Activity,占满屏幕,back回退出来
onCreate- - >onStart- - > onResume - - > onPause - - > onStop - - > onRestart- ->onStart- - > onResume

这里写图片描述
情形7:
弹出另一个Activity,未占满屏幕,back回退出来
onCreate- - >onStart- - > onResume - - > onPause - - > onResume
这里写图片描述
情形8:
pause时内存不够用,就会重新onCreate
2. Activity启动模式
启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的activity标签的android:launchMode属性设置。可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。
  启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;
讲解启动模式之前,有必要先讲解一下“任务栈”的概念;
  任务栈:每个应用都有一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity的出现顺序;比如Activity1–>Activity2–>Activity3,则任务栈为:
  这里写图片描述
  四种启动模式:
(1)standard:默认为该模式
每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
(2)singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
(3)singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop移除;
(4)singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两个应用共享该Activity实例。
新建3个Activity,分别为MainActivity、TwoActivity、ThreeActivity,以及布局文件activity_main.xml、activity_two.xm、lactivity_three.xml:

//MainActivity.java
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public  void go2(View v){
        Intent intent = new Intent(this,TwoActivity.class);
        startActivity(intent);
    }
}
// TwoActivity.java
public class TwoActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
    }
    public  void go2(View v){
        Intent intent = new Intent(this,TwoActivity.class);
        startActivity(intent);
    }
    public  void go3(View v){
        Intent intent = new Intent(this,ThreeActivity.class);
        startActivity(intent);
    }
}
// ThreeActivity.java
public class ThreeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
    }
    public  void go1(View v){
        Intent intent = new Intent(this,MainActivity.class);
        startActivity(intent);
    }
    public  void go2(View v){
        Intent intent = new Intent(this,TwoActivity.class);
        startActivity(intent);
    }
    public  void go3(View v){
        Intent intent = new Intent(this,ThreeActivity.class);
        startActivity(intent);
    }

}
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ONE" 
        android:textSize="75sp"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="45dp"
        android:layout_marginTop="131dp"
        android:text="去2" 
        android:onClick="go2"/>

</RelativeLayout>
activity_two.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TWO"
        android:textSize="75sp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="108dp"
        android:onClick="go3"
        android:text="去3" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_marginLeft="67dp"
        android:layout_toRightOf="@+id/button1"
        android:onClick="go2"
        android:text="去2自己" />

</RelativeLayout>
activity_three.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="THREE"
        android:textSize="75sp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="160dp"
        android:onClick="go3"
        android:text="去3自己" />

    <Button
        android:id="@+id/Button01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignParentLeft="true"
        android:onClick="go1"
        android:text="去1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:onClick="go2"
        android:text="去2" />

</RelativeLayout>

三个Activity运行界面分别如下:
这里写图片描述
这里写图片描述
这里写图片描述
在AndroidMainfest.xml文件中修改Activity的启动顺序launchMode:

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" 
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".TwoActivity"
            android:label="@string/title_activity_two" 
            android:launchMode="singleTop">
        </activity>
        <activity
            android:name=".ThreeActivity"
            android:label="@string/title_activity_three" 
            android:launchMode="singleTop">
        </activity>
    </application>

示例1:standard
点击顺序为:1 - - >2 - - >2 - -> 3- - >2
按back键,会依照任务栈的顺序依次回退,顺序:2 - - >3 - - >2 - -> 2- - >1
这里写图片描述
示例2:singleTop
点击顺序为:1 - - >2 - - >2 - -> 3- - >2
按back键,会依照任务栈的顺序依次回退,顺序:2 - - >3 - - >2- - >1
这里写图片描述
示例3:singleTask
点击顺序为:1 - - >2 - - >2 - -> 3- - >2
按back键,会依照任务栈的顺序依次回退,顺序:2 - - >1
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值