溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android 中 ActivityLifecycleCallbacks如何使用

發(fā)布時(shí)間:2021-06-26 17:20:14 來(lái)源:億速云 閱讀:397 作者:Leah 欄目:移動(dòng)開(kāi)發(fā)

Android 中 ActivityLifecycleCallbacks如何使用,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

MyApplication如下:

package com.cc; 
 
import java.util.LinkedList; 
 
import android.app.Activity; 
import android.app.Application; 
import android.os.Bundle; 
/** 
 * Demo示例: 
 * ActivityLifecycleCallbacks使用示例 
 * 
 * ActivityLifecycleCallbacks用于對(duì)應(yīng)用中Activity的生命周期的追蹤和回調(diào) 
 * 
 * 使用ActivityLifecycleCallbacks可實(shí)現(xiàn): 
 * 1 判斷App是否在后臺(tái)運(yùn)行 
 * 2 關(guān)閉該應(yīng)用所有Activity 
 * 
 * 
 * (1)判斷App是否在后臺(tái)運(yùn)行 
 * 在該實(shí)現(xiàn)中采用activityCounter記錄Activity的個(gè)數(shù). 
 * 通過(guò)對(duì)于activityCounter是否為0判斷當(dāng)前APP是否在前臺(tái)運(yùn)行. 
 * 
 * 從ActivityLifecycleCallbacks的實(shí)現(xiàn)方法中我們的慣性思維是: 
 * 在ActivityLifecycleCallbacks的onActivityResumed()中activityCounter+1. 
 * 在onActivityPaused()中activityCounter-1, 
 * 但是這么對(duì)么? 
 * 
 * 先看一下界面跳轉(zhuǎn)時(shí)兩個(gè)Activity的生命周期 
 * 當(dāng)從Activity A跳轉(zhuǎn)到Activity B時(shí),兩個(gè)Activity的生命周期如下: 
 * A.onPause()->B.onCreate()->B.onStart()-> B.onResume()-> A.onStop() 
 * 
 * 假若按照上述方式那么: 
 * 在A啟動(dòng)后activityCounter=1; 
 * 當(dāng)從A跳轉(zhuǎn)到B時(shí)在調(diào)用A.onPause()時(shí)執(zhí)行:activityCounter-1=0; 
 * 即該APP運(yùn)行在后臺(tái). 
 * 這當(dāng)然是錯(cuò)的,兩個(gè)界面切換的過(guò)程中APP當(dāng)然是運(yùn)行在前臺(tái)的。 
 * 
 * 如下修改: 
 * 在onActivityStarted()中對(duì)于activityCounter+1 
 * 在onActivityStopped()中對(duì)于activityCounter-1 
 * 小結(jié):注意Activity跳轉(zhuǎn)時(shí)的生命周期 
 * 
 * (2)關(guān)閉該應(yīng)用所有Activity 
 *  2.1 利用LinkedList<Activity>管理應(yīng)用中的界面 
 *  2.2 在ActivityLifecycleCallbacks的onActivityCreated() 
 *    將Activity添加到LinkedList中 
 *    在ActivityLifecycleCallbacks的onActivityDestroyed() 
 *    將Activity從LinkedList中移除 
 *  2.3 關(guān)閉應(yīng)用時(shí)銷毀LinkedList中所有Activity 
 * 
 * 備注說(shuō)明: 
 * 1 ActivityLifecycleCallbacks是在API 14及其以上才有的 
 * 2 在Android4.0以下可以在BaseActivity中按照該思路實(shí)現(xiàn) 
 * 
 */ 
public class MyApplication extends Application { 
  private static int activityCounter=0; 
  private static MyApplication mApplicationInstance; 
  private static LinkedList<Activity> mActivityLinkedList; 
  private ActivityLifecycleCallbacksImpl mActivityLifecycleCallbacksImpl; 
  @Override 
  public void onCreate() { 
    super.onCreate(); 
    mApplicationInstance=new MyApplication(); 
    mActivityLinkedList=new LinkedList<Activity>(); 
    mActivityLifecycleCallbacksImpl=new ActivityLifecycleCallbacksImpl(); 
    this.registerActivityLifecycleCallbacks(mActivityLifecycleCallbacksImpl); 
  } 
   
  public static MyApplication getInstance() { 
    if (null==mApplicationInstance) { 
      mApplicationInstance=new MyApplication(); 
    } 
    return mApplicationInstance; 
  } 
   
  //判斷App是否在后臺(tái)運(yùn)行 
  public boolean isAppRunningBackground(){ 
    boolean flag=false; 
    if(activityCounter==0){ 
      flag=true; 
    } 
    return flag; 
  } 
   
  //退出應(yīng)用 
  public void finishAllActivity(){ 
    //unregisterActivityLifecycleCallbacks(mActivityLifecycleCallbacksImpl); 
    System.out.println("--> mActivityLinkedList.size()="+mActivityLinkedList.size()); 
    if(null!=mActivityLinkedList){ 
      for(Activity activity:mActivityLinkedList){ 
        if(null!=activity){ 
          activity.finish(); 
        } 
      } 
    } 
  } 
   
   
  private class ActivityLifecycleCallbacksImpl implements ActivityLifecycleCallbacks{ 
    @Override 
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 
      System.out.println("onActivityCreated --> "+activity.getClass().getName()); 
      if (null!=mActivityLinkedList&&null!=activity) { 
        mActivityLinkedList.addFirst(activity); 
      } 
    } 
 
    @Override 
    public void onActivityStarted(Activity activity) { 
      activityCounter++; 
      System.out.println("onActivityStarted --> "+activity.getClass().getName()+",activityCounter="+activityCounter); 
    } 
 
    @Override 
    public void onActivityResumed(Activity activity) { 
      System.out.println("onActivityResumed --> "+activity.getClass().getName()); 
    } 
 
    @Override 
    public void onActivityPaused(Activity activity) { 
      System.out.println("onActivityPaused --> "+activity.getClass().getName()); 
    } 
 
    @Override 
    public void onActivityStopped(Activity activity) { 
      activityCounter--; 
      System.out.println("onActivityStopped --> "+activity.getClass().getName()+",activityCounter="+activityCounter); 
    } 
 
    @Override 
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 
      System.out.println("onActivitySaveInstanceState --> "+activity.getClass().getName()); 
    } 
 
    @Override 
    public void onActivityDestroyed(Activity activity) { 
      System.out.println("onActivityDestroyed --> "+activity.getClass().getName()); 
      if (null!=mActivityLinkedList&&null!=activity) { 
        if (mActivityLinkedList.contains(activity)) { 
          mActivityLinkedList.remove(activity); 
        } 
      } 
    } 
     
  } 
 
}

FirstActivity如下:

package com.cc; 
 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
public class FirstActivity extends Activity { 
   private Context mContext; 
   private Button mOpenNewActivityButton; 
   private Button mFinishThisActivityButton; 
   private ClickListenerImpl mClickListenerImpl; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.first_activity); 
    init(); 
  } 
   
  private void init(){ 
    mContext=this; 
    mClickListenerImpl=new ClickListenerImpl(); 
    mOpenNewActivityButton=(Button) findViewById(R.id.openNewActivityButton); 
    mOpenNewActivityButton.setOnClickListener(mClickListenerImpl); 
    mFinishThisActivityButton=(Button) findViewById(R.id.finishThisActivityButton); 
    mFinishThisActivityButton.setOnClickListener(mClickListenerImpl); 
  } 
   
   
  private class ClickListenerImpl implements OnClickListener { 
    @Override 
    public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.openNewActivityButton: 
        Intent intent=new Intent(mContext, SecondActivity.class); 
        startActivity(intent); 
        break; 
      case R.id.finishThisActivityButton: 
        finish(); 
        break; 
 
      default: 
        break; 
      } 
 
    } 
 
  } 
   
  @Override 
  protected void onResume() { 
    super.onResume(); 
    //System.out.println(" first Activity onResume --> "+MyApplication.getInstance().isAppRunningBackground()); 
  } 
   
  @Override 
  protected void onStop() { 
    super.onStop(); 
    //System.out.println(" first Activity onStop --> "+MyApplication.getInstance().isAppRunningBackground()); 
  } 
   
   
}

SecondActivity如下:

package com.cc; 
 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
 
public class SecondActivity extends Activity { 
   private Context mContext; 
   private Button mOpenNewActivityButton; 
   private Button mFinishThisActivityButton; 
   private ClickListenerImpl mClickListenerImpl; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second_activity); 
    init(); 
  } 
   
  private void init(){ 
    mContext=this; 
    mClickListenerImpl=new ClickListenerImpl(); 
    mOpenNewActivityButton=(Button) findViewById(R.id.openNewActivityButton); 
    mOpenNewActivityButton.setOnClickListener(mClickListenerImpl); 
    mFinishThisActivityButton=(Button) findViewById(R.id.finishThisActivityButton); 
    mFinishThisActivityButton.setOnClickListener(mClickListenerImpl); 
  } 
   
   
  private class ClickListenerImpl implements OnClickListener { 
    @Override 
    public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.openNewActivityButton: 
        Intent intent=new Intent(mContext, ThirdActivity.class); 
        startActivity(intent); 
        break; 
 
      case R.id.finishThisActivityButton: 
        finish(); 
        break; 
 
      default: 
        break; 
      } 
 
    } 
 
  } 
 
   
}

ThirdActivity如下:

package com.cc; 
 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
 
public class ThirdActivity extends Activity { 
   private Context mContext; 
   private Button mFinishAllActivityButton; 
   private Button mFinishThisActivityButton; 
   private ClickListenerImpl mClickListenerImpl; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.third_activity); 
    init(); 
  } 
   
  private void init(){ 
    mContext=this; 
    mClickListenerImpl=new ClickListenerImpl(); 
    mFinishThisActivityButton=(Button) findViewById(R.id.finishThisActivityButton); 
    mFinishThisActivityButton.setOnClickListener(mClickListenerImpl); 
    mFinishAllActivityButton=(Button) findViewById(R.id.finishAllActivityButton); 
    mFinishAllActivityButton.setOnClickListener(mClickListenerImpl); 
  } 
   
   
  private class ClickListenerImpl implements OnClickListener { 
    @Override 
    public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.finishThisActivityButton: 
        finish(); 
        break; 
      case R.id.finishAllActivityButton: 
        MyApplication.getInstance().finishAllActivity(); 
        break; 
      default: 
        break; 
      } 
 
    } 
  } 
   
  @Override 
  protected void onResume() { 
    super.onResume(); 
    //System.out.println(" third Activity onResume --> "+MyApplication.getInstance().isAppRunningBackground()); 
  } 
   
  @Override 
  protected void onStop() { 
    super.onStop(); 
    //System.out.println(" third Activity onStop --> "+MyApplication.getInstance().isAppRunningBackground()); 
  } 
   
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
    //System.out.println(" third Activity onDestroy --> "+MyApplication.getInstance().isAppRunningBackground()); 
  } 
 
   
}

first_activity.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" 
  android:paddingBottom="@dimen/activity_vertical_margin" 
  android:paddingLeft="@dimen/activity_horizontal_margin" 
  android:paddingRight="@dimen/activity_horizontal_margin" 
  android:paddingTop="@dimen/activity_vertical_margin" 
  tools:context="com.cc.FirstActivity" > 
 
  <Button 
    android:id="@+id/openNewActivityButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="open new Activity" /> 
 
  <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@id/openNewActivityButton" 
    android:layout_centerInParent="true" 
    android:layout_marginBottom="50dip" 
    android:textSize="20sp" 
    android:textColor="@android:color/holo_red_light" 
    android:text="This is the first Activity" /> 
 
  <Button 
    android:id="@+id/finishThisActivityButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/openNewActivityButton" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="50dip" 
    android:text="finish this activity" /> 
 
</RelativeLayout>

second_activity.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" 
  android:paddingBottom="@dimen/activity_vertical_margin" 
  android:paddingLeft="@dimen/activity_horizontal_margin" 
  android:paddingRight="@dimen/activity_horizontal_margin" 
  android:paddingTop="@dimen/activity_vertical_margin" 
  tools:context="com.cc.FirstActivity" > 
 
  <Button 
    android:id="@+id/openNewActivityButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="open new Activity" /> 
 
  <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@id/openNewActivityButton" 
    android:layout_centerInParent="true" 
    android:layout_marginBottom="50dip" 
    android:textSize="20sp" 
    android:textColor="@android:color/holo_red_light" 
    android:text="This is the second Activity" /> 
 
  <Button 
    android:id="@+id/finishThisActivityButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/openNewActivityButton" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="50dip" 
    android:text="finish this activity" /> 
 
</RelativeLayout>

third_activity.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" 
  android:paddingBottom="@dimen/activity_vertical_margin" 
  android:paddingLeft="@dimen/activity_horizontal_margin" 
  android:paddingRight="@dimen/activity_horizontal_margin" 
  android:paddingTop="@dimen/activity_vertical_margin" 
  tools:context="com.cc.FirstActivity" > 
 
  <TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@id/openNewActivityButton" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="100dp" 
    android:text="This is the third Activity" 
    android:textColor="@android:color/holo_red_light" 
    android:textSize="20sp" /> 
 
  <Button 
    android:id="@+id/finishThisActivityButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/textView" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="50dip" 
    android:text="finish this activity" /> 
 
  <Button 
    android:id="@+id/finishAllActivityButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/finishThisActivityButton" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="50dip" 
    android:text="finish All Activity" /> 
 
</RelativeLayout>

AndroidManifest.xml如下:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.cc" 
  android:versionCode="1" 
  android:versionName="1.0" > 
 
  <uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="14" /> 
 
  <application 
    android:name="com.cc.MyApplication" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
      android:name=".FirstActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
    </activity> 
     
    <activity android:name="com.cc.SecondActivity"/> 
    <activity android:name="com.cc.ThirdActivity"/> 
  </application> 
 
</manifest>

關(guān)于Android 中 ActivityLifecycleCallbacks如何使用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI