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>

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

(0)

相关推荐

  • Android中Activity和Fragment传递数据的两种方式

    1.第一种方式,也是最常用的方式,就是使用Bundle来传递参数 MyFragment myFragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putString("DATA",values);//这里的values就是我们要传的值 myFragment.setArguments(bundle); 然后在Fragment中的onCreatView方法中,通过getArgments()方法,获取到bundle

  • 微信Android热更新Tinker使用详解(星空武哥)

    Tinker是什么 Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码.So库以及资源,让应用能够在不需要重新安装的情况下实现更新.当然,你也可以使用Tinker来更新你的插件. 它主要包括以下几个部分: gradle编译插件: tinker-patch-gradle-plugin 核心sdk库: tinker-android-lib 非gradle编译用户的命令行版本: tinker-patch-cli.jar 为什么使用Tinker 当前市面的热补丁方案有很多,其中比较

  • Android SQLite数据库版本升级的管理实现

    Android SQLite数据库版本升级的管理实现 我们知道在SQLiteOpenHelper的构造方法: super(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 中最后一个参数表示数据库的版本号.当新的版本号大于当前的version时会调用方法: onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 所以我们

  • Android中okhttp3使用详解

    一.引入包 在项目module下的build.gradle添加okhttp3依赖 compile 'com.squareup.okhttp3:okhttp:3.3.1' 二.基本使用 1.okhttp3 Get 方法 1.1 .okhttp3 同步 Get方法 /** * 同步Get方法 */ private void okHttp_synchronousGet() { new Thread(new Runnable() { @Override public void run() { try {

  • Android LocationManager获取经度与纬度等地理信息

    Android LocationManager获取经度与纬度等地理信息 利用LocationManager实现定位功能 1 实时更新经度,纬度 2 根据经度和纬度获取地理信息(比如:国家,街道等)(略过) MainActivity如下: package cc.bb; import java.util.Iterator; import java.util.List; import android.location.Location; import android.location.Location

  • Android Intent调用 Uri的方法总结

    Android Intent调用 Uri的方法总结 //调用浏览器 Uri uri = Uri.parse(""); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it); //显示某个坐标在地图上 Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.Action_VIEW,uri);

  • Android 软键盘状态并隐藏输入法的实例

    Android 软键盘状态并隐藏输入法的实例 1 软键盘状态的切换 2 强制隐藏输入法键盘 MainActivity如下: package cc.c; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.InputMethodManager; import android.widget.Button

  • Android 开发之Dialog中隐藏键盘的正确使用方法

    Android 开发之Dialog中隐藏键盘的正确使用方法 场景:弹出一个Dialog,里面有一个EditText,用来输入内容,因为输入时,需要弹出键盘,所以当Dialog消失时,键盘要一起隐藏. 现在我们做一个自定义的Dialog MyDialog extends Dialog 一开始认为这个功能很容易实现,于是写了下面的代码 //Dialog的构造函数中写 this.setOnDismissListener(new OnDismissListener() { @Override publi

  • Android 中 ActivityLifecycleCallbacks的实例详解

    Android 中 ActivityLifecycleCallbacks的实例详解           以上就是使用ActivityLifecycleCallbacks的实例,代码注释写的很清楚大家可以参考下, MyApplication如下: package com.cc; import java.util.LinkedList; import android.app.Activity; import android.app.Application; import android.os.Bun

  • Android 中ContentProvider的实例详解

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

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

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

  • Android中ShapeableImageView使用实例详解(告别shape、三方库)

    目录 效果 前言 使用 引入material包 常规 圆角 圆 描边 切角 菱形 叶子 半圆 六边形 属性 扩展 shapeAppearance ShapeAppearanceModel MaterialShapeDrawable 说明 描边问题 默认圆角问题 Github 感谢 最后 效果 前言 先来看一下ShapeableImageView是什么 由上图可以看到ShapeableImageView也没有什么神秘的,不过是ImageView的一个子类而已,但是从效果图来看,在不写shape.不

  • Android 中SQLite技术实例详解

    Android和iOS的数据库都是用SQLite来实现. 一,SQLite数据库简介: 轻量级:SQLite数据库是一个轻量级的数据库,适用于少量数据的CURD; 文件本质:SQLite数据库支持大部分SQL语法,允许使用SQL语句操作数据库,其本质是一个文件,不需要安装启动. 数据读写:SQLite数据库打开只是一个文件的读写流. 二.简单的数据库语句知识 在android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持NULL,INTEGER,REAL(浮点数字),TE

  • Android中Lifecycle的原理详解

    目录 一.基本使用 二.LifecycleObserver接口和LifecycleOwner接口 三.getLifecycle() 四.绑定生命周期 总结 Lifecycle是Android Architecture Components的成员,是一个生命周期感知组件,能够感知Activity.Fragment等组件的生命周期变化,并将变化通知到已注册的观察者.正确的使用有助于更好地组织代码,减少内存泄漏,增强稳定.下面分析他的实现原理,看看到底只怎么感知生命周期的. 一.基本使用 1.引入依赖

  • Android 帧动画的实例详解

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

  • Android的搜索框架实例详解

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

  • Android Intent封装的实例详解

    Android Intent封装的实例详解 什么是Intent: Intent是协调应用间.组件之间的通讯和交互.通过Intent你可以启动Activity.Service.Broadcasts.更可以跨程序调用第三方组件.例如:启动拨打电话界面.音乐播放等. 组件     启动 Activity startActicity() Service startService(),bindService( ) Broadcasts sendBroadcast() 使用Intent: 栗子:在一个Act

  • Android中SQLite 使用方法详解

    Android中SQLite 使用方法详解 现在的主流移动设备像android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧.对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取. 下面就向大家介绍一下SQLite常用的操作方法,为了方便,我将代码写在了Activity的onCreate中: @Ov

随机推荐