Android 中 ActivityLifecycleCallbacks的實(shí)例詳解
Android 中 ActivityLifecycleCallbacks的實(shí)例詳解
以上就是使用ActivityLifecycleCallbacks的實(shí)例,代碼注釋寫(xiě)的很清楚大家可以參考下,
MyApplication如下:
package com.cc; import java.util.LinkedList; import android.app.Activity; import android.app.Application; import android.os.Bundle; /** * Demo示例: * ActivityLifecycleCallbacks使用示例 * * ActivityLifecycleCallbacks用于對(duì)應(yīng)用中Activity的生命周期的追蹤和回調(diào) * * 使用ActivityLifecycleCallbacks可實(shí)現(xiàn): * 1 判斷App是否在后臺(tái)運(yùn)行 * 2 關(guān)閉該應(yīng)用所有Activity * * * (1)判斷App是否在后臺(tái)運(yùn)行 * 在該實(shí)現(xiàn)中采用activityCounter記錄Activity的個(gè)數(shù). * 通過(guò)對(duì)于activityCounter是否為0判斷當(dāng)前APP是否在前臺(tái)運(yùn)行. * * 從ActivityLifecycleCallbacks的實(shí)現(xiàn)方法中我們的慣性思維是: * 在ActivityLifecycleCallbacks的onActivityResumed()中activityCounter+1. * 在onActivityPaused()中activityCounter-1, * 但是這么對(duì)么? * * 先看一下界面跳轉(zhuǎn)時(shí)兩個(gè)Activity的生命周期 * 當(dāng)從Activity A跳轉(zhuǎn)到Activity B時(shí),兩個(gè)Activity的生命周期如下: * A.onPause()->B.onCreate()->B.onStart()-> B.onResume()-> A.onStop() * * 假若按照上述方式那么: * 在A啟動(dòng)后activityCounter=1; * 當(dāng)從A跳轉(zhuǎn)到B時(shí)在調(diào)用A.onPause()時(shí)執(zhí)行:activityCounter-1=0; * 即該APP運(yùn)行在后臺(tái). * 這當(dāng)然是錯(cuò)的,兩個(gè)界面切換的過(guò)程中APP當(dāng)然是運(yùn)行在前臺(tái)的。 * * 如下修改: * 在onActivityStarted()中對(duì)于activityCounter+1 * 在onActivityStopped()中對(duì)于activityCounter-1 * 小結(jié):注意Activity跳轉(zhuǎn)時(shí)的生命周期 * * (2)關(guān)閉該應(yīng)用所有Activity * 2.1 利用LinkedList<Activity>管理應(yīng)用中的界面 * 2.2 在ActivityLifecycleCallbacks的onActivityCreated() * 將Activity添加到LinkedList中 * 在ActivityLifecycleCallbacks的onActivityDestroyed() * 將Activity從LinkedList中移除 * 2.3 關(guān)閉應(yīng)用時(shí)銷(xiāo)毀LinkedList中所有Activity * * 備注說(shuō)明: * 1 ActivityLifecycleCallbacks是在API 14及其以上才有的 * 2 在Android4.0以下可以在BaseActivity中按照該思路實(shí)現(xiàn) * */ 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是否在后臺(tái)運(yùn)行 public boolean isAppRunningBackground(){ boolean flag=false; if(activityCounter==0){ flag=true; } return flag; } //退出應(yīng)用 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>
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android使用Gallery實(shí)現(xiàn)照片拖動(dòng)的特效
這篇文章主要介紹了Android如何使用Gallery實(shí)現(xiàn)照片拖動(dòng)的特效,幫助大家更好的理解和利用Android進(jìn)行開(kāi)發(fā),感興趣的朋友可以了解下2021-01-01Android開(kāi)發(fā)組件flutter的20個(gè)常用技巧示例總結(jié)
這篇文章主要為大家介紹了Android開(kāi)發(fā)組件flutter的20個(gè)常用技巧示例總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Android開(kāi)發(fā)中實(shí)現(xiàn)發(fā)送短信的小程序示例
這篇文章主要介紹了Android開(kāi)發(fā)中實(shí)現(xiàn)發(fā)送短信的小程序示例,文中還附帶了一個(gè)監(jiān)聽(tīng)廣播接收者的升級(jí)版短信發(fā)送例子,需要的朋友可以參考下2016-04-04基于SceneForm實(shí)現(xiàn)子彈射擊(繪制子彈運(yùn)行軌跡)
這篇文章主要為大家詳細(xì)介紹了基于SceneForm實(shí)現(xiàn)子彈射擊,繪制子彈運(yùn)行軌跡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Android 實(shí)現(xiàn)通知消息水平播放、無(wú)限循環(huán)效果
Android 實(shí)現(xiàn)通知消息水平播放、無(wú)限循環(huán)效果非常常見(jiàn),今天小編給大家分享實(shí)例代碼感興趣的朋友參考下吧2017-08-08Flutter實(shí)現(xiàn)不同縮放動(dòng)畫(huà)效果詳解
這篇文章主要為大家詳細(xì)介紹了Flutter利用不同組件(ScaleTransition、SizeTransition、AnimatedSize和AnimatedBuilder)實(shí)現(xiàn)不同縮放動(dòng)畫(huà)效果,感興趣的可以動(dòng)手嘗試一下2022-06-06android實(shí)現(xiàn)自動(dòng)滾動(dòng)的Gallary控件效果
這篇文章主要介紹了android實(shí)現(xiàn)自動(dòng)滾動(dòng)的Gallary控件效果,涉及Android中Gallary控件的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10DownloadManager實(shí)現(xiàn)文件下載功能
這篇文章主要為大家詳細(xì)介紹了DownloadManager實(shí)現(xiàn)文件下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11