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>

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

时间: 2024-08-02 09:29:32

Android 中 ActivityLifecycleCallbacks的实例详解的相关文章

Java中的instanceof关键字在Android中的用法实例详解_java

在下面介绍Android中如何使用instanceof关键字开发更方便时,先来温习一下java中instanceof的概念. instanceof大部分的概念是这样定义的:instanceof是Java的一个二元操作符,和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据.举个栗子: String s = "I AM an Object!"; boolean isObj

Android 中ContentProvider的实例详解

Android 中ContentProvider的实例详解 Content Provider 的简单介绍: * Android中的Content Provider 机制可支持在多个应用中存储和读取数据.这也是跨应用 共享数据的唯一方式.在Android系统中,没有一个公共的内存区域,供多个应用共享存储数据: * Android 提供了一些主要数据类型的ContentProvider ,比如:音频.视频.图片和私人通讯录等: 在android.provider 包下面找到一些android提供的C

android 显示gif图片实例详解

  android 显示gif图片实例详解           在android中不支持gif格式的图片,但是由于我希望在我的程序中刚刚加载的时候有一个小人在跑步表示正在加载.而这个小人跑就是一个gif图片.也就是希望程序一启动时就加载gif图片.在网上查找了一些方法不知道是我使用的android的版本高(android4.4)还是什么问题就是加载不出来.最后想了一个办法加载了出来.这个办法就是将gif放在webView中让其显示. 下面是关于这个的代码: activity_prepare_fu

Android中Service(后台服务)详解

  这篇文章主要介绍了Android中Service(后台服务)详解,本文讲解了Service的概念.作用.生命周期.启动方式和代码实例等内容,需要的朋友可以参考下 1.概念: (1).Service可以说是一个在后台运行的Activity.它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了. (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示. (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用. 2.作用: (1).它用于处理一

Android编程之SurfaceView实例详解_Android

本文实例讲述了Android编程之SurfaceView用法.分享给大家供大家参考,具体如下: 关于surfaceView相关知识: View和SurfaceView主要区别: 1. View只能在UI线程中刷新,而SurfaceView可以在子线程中刷新 2. SurfaceView可以控制刷新频率 SurfaceView几个重要的方法: 1. 继承SurfaceView 后调用getHolder()方法可以获取到mSurfaceHolder对象这个对于可以控制SurfaceView的绘制 2

Android的搜索框架实例详解_Android

基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

Android的搜索框架实例详解

基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

Android 帧动画的实例详解

Android 帧动画的实例详解 对于 Android 帧动画 大体上可以理解成 一张张图片 按一定顺序切换, 这样当连续几张图是一组动画时,就可以连起来了看成是一个小电影,你懂得 好得,比就装到这里,下面开始进入正题,由于产品需求 需要做一个 声音喇叭动态切换的样式,我特么第一就想到是帧动画切换,然后就百度了一些资料,发现 真的, 现在这个网上太多的资料是 copy粘贴过来的, 一错全错,对于这种情况我只想说,made,一群垃圾, 所以今天我将带你们走进Android 正确帧动画地址. 第一步

Android开发之Android.mk模板的实例详解

Android开发之Android.mk模板的实例详解 关于Android NDK开发的文章已经比较多了,我的博客中也分享了很多NDK开发相关经验和技巧,今天简单写了一个 Android.mk 的示例模板,供初学者参考. 本模板主要给大家示例 Android NDK 开发中的如下几个问题: 1. 如何自动添加需要编译的源文件列表   2. 如何添加第三方静态库.动态库的依赖   3. 如何构造一个完整的NDK工程框架 假设我们的项目依赖 libmath.a, libjson.a, libffmp