Android 中 ActivityLifecycleCallbacks的实例详解

作者:lfdfhl 时间:2022-08-12 06:03:34 

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>

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

来源:http://blog.csdn.net/lfdfhl/article/details/50761556

标签:Android,ActivityLifecycleCallbacks
0
投稿

猜你喜欢

  • Java多线程工具篇BlockingQueue的详解

    2022-07-03 20:47:56
  • Android Studio 4.1没有GsonFormat插件的解决

    2021-12-14 18:12:44
  • 浅谈C# 构造方法(函数)

    2021-11-23 08:01:49
  • Android实现手机游戏隐藏虚拟按键

    2023-01-29 02:04:55
  • android实现点击按钮控制图片切换

    2022-10-16 02:38:55
  • Android不规则封闭区域填充色彩的实例代码

    2022-10-17 08:33:05
  • Android开发InputManagerService创建与启动流程

    2021-07-11 20:45:22
  • JDK线程池和Spring线程池的使用实例解析

    2023-02-24 13:27:32
  • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用

    2021-08-08 23:56:44
  • Android之复选框对话框用法实例分析

    2023-10-03 05:07:03
  • C#编程自学之开篇介绍

    2023-12-16 07:58:55
  • 基于C#动手实现网络服务器Web Server

    2023-01-21 20:13:28
  • c#使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    2023-04-08 02:00:19
  • Kotlin自定义View系列教程之标尺控件(选择身高、体重等)的实现

    2022-06-26 00:35:40
  • Android自定义顶部导航栏控件实例代码

    2022-02-11 13:43:16
  • 在C#中使用OpenCV(使用OpenCVSharp)的实现

    2023-02-21 16:15:38
  • Android 获取设备屏幕大小的几种方法总结

    2022-11-30 14:29:07
  • Spring Boot如何优化内嵌的Tomcat示例详解

    2023-11-13 17:52:53
  • Android中使用ViewStub实现布局优化

    2023-11-28 21:16:18
  • springboot中filter的用法详解

    2022-04-02 19:52:37
  • asp之家 软件编程 m.aspxhome.com