Android 中 ActivityLifecycleCallbacks的实例详解

时间:2022-07-28
本文章向大家介绍Android 中 ActivityLifecycleCallbacks的实例详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Android 中 ActivityLifecycleCallbacks的实例详解

以上就是使用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  

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!