Android 中 ActivityLifecycleCallbacks如何使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
MyApplication如下:
package com.cc;
import java.util.LinkedList;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
/**
* Demo示例:
* ActivityLifecycleCallbacks使用示例
*
* ActivityLifecycleCallbacks用于對應用中Activity的生命周期的追蹤和回調
*
* 使用ActivityLifecycleCallbacks可實現:
* 1 判斷App是否在后臺運行
* 2 關閉該應用所有Activity
*
*
* (1)判斷App是否在后臺運行
* 在該實現中采用activityCounter記錄Activity的個數.
* 通過對于activityCounter是否為0判斷當前APP是否在前臺運行.
*
* 從ActivityLifecycleCallbacks的實現方法中我們的慣性思維是:
* 在ActivityLifecycleCallbacks的onActivityResumed()中activityCounter+1.
* 在onActivityPaused()中activityCounter-1,
* 但是這么對么?
*
* 先看一下界面跳轉時兩個Activity的生命周期
* 當從Activity A跳轉到Activity B時,兩個Activity的生命周期如下:
* A.onPause()->B.onCreate()->B.onStart()-> B.onResume()-> A.onStop()
*
* 假若按照上述方式那么:
* 在A啟動后activityCounter=1;
* 當從A跳轉到B時在調用A.onPause()時執行:activityCounter-1=0;
* 即該APP運行在后臺.
* 這當然是錯的,兩個界面切換的過程中APP當然是運行在前臺的。
*
* 如下修改:
* 在onActivityStarted()中對于activityCounter+1
* 在onActivityStopped()中對于activityCounter-1
* 小結:注意Activity跳轉時的生命周期
*
* (2)關閉該應用所有Activity
* 2.1 利用LinkedList<Activity>管理應用中的界面
* 2.2 在ActivityLifecycleCallbacks的onActivityCreated()
* 將Activity添加到LinkedList中
* 在ActivityLifecycleCallbacks的onActivityDestroyed()
* 將Activity從LinkedList中移除
* 2.3 關閉應用時銷毀LinkedList中所有Activity
*
* 備注說明:
* 1 ActivityLifecycleCallbacks是在API 14及其以上才有的
* 2 在Android4.0以下可以在BaseActivity中按照該思路實現
*
*/
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是否在后臺運行
public boolean isAppRunningBackground(){
boolean flag=false;
if(activityCounter==0){
flag=true;
}
return flag;
}
//退出應用
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>
關于Android 中 ActivityLifecycleCallbacks如何使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。