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
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 利用Sql处理MR栅格数据
- Netty组件之Channel注册
- 使用 kubeadm 安装单 master kubernetes 集群
- 垃圾回收算法(4)-复制算法
- Digital-Signature-Hijack:一款针对数字签名劫持的PowerShell脚本
- 使用TensorFlow物体检测模型、Python和OpenCV的社交距离检测器
- 基于OpenCV和Tensorflow的深蹲检测器
- BBPress未经身份验证的提权漏洞分析
- 开源日志管理系统Graylog之Sidecar功能实践
- CentOS-AltArch-7(ARM版)下源码编译MySQL5.7.31
- 用BurpSuit的Burpy插件搞定WEB端中的JS加密算法
- CentOS7下安装文档协作工具Confluence7.2.1
- caret包进行机器学习
- 容器化Go应用--基础镜像的未知时区问题
- 写给自己的Object和Function的3个灵魂拷问