androidactivity後台
A. android activity間通訊,跳轉回主activity時總會刷新怎麼辦
總會刷新與後台設置有關系。
有可能你進行跳轉後,你的主activity被回收了,你返回的是一個新的Activity,這和你的activity
設置有關。
正常的回退操作不會對activity刷新。除非你在onresume,或onrestart等方法中進行了界面操作,因
為跳轉回activity是,會執行onresume或onrestart->onstart()->onresume()生命周期。
當然,除此之外還有其他多種可能,要看你的代碼而定,如調用startActivityforresult進行跳轉,
在接收onactivityresult()方法中處理了ui。
B. Android實現後台返回前台再次顯示廣告
市面上主流的APP都是在啟動頁做廣告展示的,即通常都是叫SplashActivity的是APP的launcher頁面,在manifest文件中配置, 2017年以來, 你會發現越來越多的APP在進入後台時隔一定時間後再次回到前台會再次顯示廣告界面, 3s自動播放, 或者手動點擊跳過
比如網易雲音樂, 淘寶, 京東商城啦, 似乎現在都是很主流的做法了,剛好最近項目中也有這樣的需求, 我們也實現了一遍,所以寫出來分享下,相互學習借鑒
要實現後台返回前台顯示廣告的邏輯, 主要的點在於監聽APP進入後台的時間點, 和APP從後台返回到前台的時間點
我們是在Application子類中完成的, 定義三個常量記錄當前APP狀態
在Application中需要監聽Activity的生命周期變化, 是application類已經提供好的一個方法, 它可以非常方便的監聽整個項目中的所有activity的生命周期
可以很清晰的看到Activity的生命周期函數都會回調到ActivityLifecycleCallbacks介面來, 我們讓Application實現此介面, 並在相應的回調方法中的完成具體的後台狀態的監聽
定義幾個需要用的變數記錄相關狀態和時間
在onResume回調中監聽回到前台的判斷, 只要activity一旦獲取焦點這個方法都會觸發,並且會觸發多次
在onStop回調中監聽程序進入後台的判斷
在onTrimMemory中監聽應用程序的切換,這也是一種監聽方式.因為有時候onStop的回調不一定會完全執行(尤其是切換最近使用APP列表時),所以這個方法也是必須的
最後, 就可以得到當前APP的准確狀態(sAppState)了, 是否可以再次顯示廣告
測試過程中,發現大部分品牌的手機都是OK的, 但是也有意外的,OPPO R9在切換應用時,一個回調都沒觸發,一定是Color OS改動太大, 目前尚無法處理.OV手機適配起來就是費勁啊
最後補充一個判斷程序是否前台的API
各位大佬們如果有更好的實現,歡迎提供思路!
C. Android 同一個程序在後台有兩個Activity
如果不是你想要的 , 檢查Androidmanifast文件中的 taskAffinity 和 launchMode
LaunchMode 設置為single Task 其他不會新開棧隊列的也可以
taskAffinity 從androidmanifest 中移除,有需要用到的android大佬別看了
重新打包android 發現只有一個activity 在後台展示了
D. 如何使安卓軟體中的Activity在後台以及關閉屏幕後能繼續運行
要實現軟體後台運行,只需要改寫返回鍵事件監聽,使得back鍵功能類似home鍵,讓Acitivty退至後台時不被系統銷毀,代碼如下:
public boolean onKeyDown(int keyCode, KeyEvent event) {
PackageManager pm = getPackageManager();
ResolveInfo homeInfo =
pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), 0);
if (keyCode == KeyEvent.KEYCODE_BACK) {
ActivityInfo ai = homeInfo.activityInfo;
Intent startIntent = new Intent(Intent.ACTION_MAIN);
startIntent.addCategory(Intent.CATEGORY_LAUNCHER);
startIntent.setComponent(new ComponentName(ai.packageName, ai.name));
startActivitySafely(startIntent);
return true;
} else
return super.onKeyDown(keyCode, event);
}
private void startActivitySafely(Intent intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "null",
Toast.LENGTH_SHORT).show();
} catch (SecurityException e) {
Toast.makeText(this, "null",
Toast.LENGTH_SHORT).show();
}
}
E. Android app後台回到前台時的監聽
在一次項目,有個需求涉及到切後台回到app時,需要調起一個彈窗,以這個需求為例子,跟大家分享下我如何實現的(大牛輕拍 = = )
首先,我們在app初始化時,要注冊activity生命周期的回調,我這邊項目里在BaseApplication初始化時調用()
它需要一個ActivityLifecycleCallbacks類型的參數
這個介面涉及到所有activity生命周期的回調
回歸正題,先初始化ActivityLifecycleCallbacks,
我們現在要做的是後台回前台,所以我們只選擇onActivityStarted和onActivityPaused
我是這么做判斷的,給個foregroundActivityCount去表示當前app有多少個activity處於啟動的狀態,給個Boolean值appInBackground判斷app是否處於後台,每次打開app,當啟動一個activity時,就統計開啟activity的次數,並且調用你所需要的監聽方法;只要在start 和 stop時判斷有所activity都stop了,當當前activity啟動次數為0時,說明app處於後台;
初始化已經完成,接下來就是怎麼調用了。我們去到後台回來時需要操作的activity或者fragment,在初始化時調取BaseApplication裡面剛才設定的方法
在裡面寫下你後台回來時你需要的操作
還有一個缺陷,假如是在指定fragment做監聽怎麼辦?其實都差不多的,fragment在activity里,綁定 了activity的生命周期,假設我們要在指定的fragment才調取這個方法,我們需要在加一層判斷,判斷當前fragment是否可見
這樣,只要你每次從後台回來,都可以監聽到,但如果不在當前fragment的話,就不會調用你設定的方法。
以上,是我剛接觸不久的問題,分享給大家,寫的不好的大家見諒,有問題可以評論或私信我,本人還是實習生,請輕拍= =
F. 安卓開發:如何得知當前activity是被壓入後台,還是跳轉到新的activity
最近學習安卓開發activity的生命周期,對單個活動的生命周期較為熟悉。此時師兄拋出問題,當一個activity進入 onStop() 時,如何得知時由於用戶點擊了主頁鍵,還是由於進入了另一個本程序的activity?
查閱網路資源後,得知可以通過安卓本身的多種方法來判斷。不過某些方法的使用需要獲取用戶授權,或者需要較高版本的安卓系統。不過本文主要介紹通過activity本身的生命周期回調函數來判斷。
由於設計兩個activity的跳轉,所以我們應該去考慮多個activity的生命周期回調函數順序。查閱並測試可知,當進行activity跳轉時,先執行原來activity的 onPause() 和,然後執行第二個activity的 onCreate() 、 onStart() 、 onResume() ,再執行第一個activity的 onStop 。如圖所示,紅色是第一個activity的回調函數執行,藍色是第二個。
我們可以利用這個特點,通過一個static變數來記錄當前run的activity數量,當這個數量為0的時候,即程序被壓入後台,當這個數量不為0,則表明當前執行了一個跳轉操作。
首先新建一個 BaseActivity 類,聲明一個static變數,讓別的activity全部繼承。並在 onStart() 和 onStop() 中修改 count 。
創建 MainActivity 類,繼承自 BaseActivity 類,同時修改 onStop() ,檢查 count 的值,判斷此次導致 onStop() 的原因。我在這個activity中添加了一個button用於跳轉到第二個activity。
這個類很簡單,沒有什麼功能,只是跳轉過來後,執行基類的 onCreate() 方法。
至此,我們便實現了通過activity生命周期回調函數判斷是否被壓入後台。不過,後來學長針對我的這種方式提出了漏洞——當引用外部SDK,且外部SDK中可以彈出未繼承我們自定義的base基類的activity,那麼怎麼處理這種情況呢?這里就要用到安卓SDK提供的全局生命周期類了——Application.,這里我們之後再談。
G. 如何使安卓軟體中的Activity在後台以及關閉屏幕後能繼續運行
需求違背taskstack設計bacticvity返彈棧銷毀能繼續存嘗試用別比線程intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);並設置台運行設置intent啟activity優先創建新taskactivity做該taskroot實向要activityb按返候activitya同b銷毀要重寫onKeyDown調更改返按鈕行改啟activitya注意給a設置singleTask建議做即使要讓B台運行要寫線程所要做任務封裝線程自控制
H. 關於安卓intent啟動activity的幾種情況
我們一般寫的比較簡單的方法就是starActivity(new Intent(context,A.class)).這種啟動的方式很簡單,就是一個從當前界面跳轉到下一個activity界面。
首先我們先要說一個問題,當你有彈窗信息,或者通知欄裡面出現了通知,然後你點擊進去,不知道你有沒有在意,APP會在五秒鍾之後打開,當然,有的不會 大多數還是會的。現在我們就說一下這個問題
在谷歌的 Android API Guides 中,特意提醒開發者不要在後台啟動 activity,包括在 Service 和 BroadcastReceiver 中,這樣的設計是為了避免在用戶毫不知情的情況下突然中斷用戶正在進行的工作.
就是當通過 home 鍵將當前 activity 置於後台時,任何在後台startActivity 的操作都將會延遲 5 秒,除非該應用獲取了 "android.permission.STOP_APP_SWITCHES" 許可權.但是這個許可權是系統級別的許可權.
解決方法:
不能夠用傳統的startActivity來啟動Activity
Intent intent = new Intent(context, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
而是要用以下形式來啟動Activity:
Intent intent = new Intent(context, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent =
PendingIntent.getActivity(context, 0, intent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
OK,這種方式啟動activity,一般是用在有後台任務的時候
starActivityforResult(),裡面有兩個參數,一個是intent,還有一個是requestcode,當你啟動下一個界面的然後又關閉的時候,會得到一個返回值,這個返回值就是這個requestcode,你需要做的就是通過onActivityforResult()方法去進行對這個requestcode進行判斷,處理好相應的邏輯
這個文章是我睡前寫的,手機上面實在不好打字
I. 在android中,設置一個activity在後台運行
這個需求違背了task stack的設計,b acticvity返回之後 彈棧就會銷毀的 不能繼續存在,你可以嘗試用別的方法比如線程。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);並不是設置後台運行,而是設置這個intent啟動的activity優先創建一個新的task將這個activity做為該task的root。
如果實在是向要在activity b中按返回的時候回到activity a 同時b不銷毀,那就要重寫onKeyDown回調來更改返回按鈕的行為了,改為啟動activity a。但是注意給a 設置 singleTask。
但是不建議這么做,因為即使你要讓B在後台運行,你也是要寫線程的,所以最好是把要做的任務封裝到一個線程里去,然後自己控制。
J. 請問,如何使安卓軟體中的Activity在後台以及關閉屏幕後能繼續運行
實現activity後台運行有兩種方法:
方法一:
添加下列代碼即可:
java">Intentintent=newIntent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
方法二:
此方法其實不是主要是屏蔽Keycode_Back,讓它不結束(finish())Activity,直接顯示HOME界面。
PackageManagerpm=getPackageManager();
ResolveInfohomeInfo=pm.resolveActivity(newIntent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME),0);
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_BACK){
ActivityInfoai=homeInfo.activityInfo;
IntentstartIntent=newIntent(Intent.ACTION_MAIN);
startIntent.addCategory(Intent.CATEGORY_LAUNCHER);
startIntent.setComponent(newComponentName(ai.packageName,
ai.name));
startActivitySafely(startIntent);
returntrue;
}else
returnsuper.onKeyDown(keyCode,event);
}
voidstartActivitySafely(Intentintent){
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try{
startActivity(intent);
}catch(ActivityNotFoundExceptione){
Toast.makeText(this,R.string.unabletoopensoftware,
Toast.LENGTH_SHORT).show();
}catch(SecurityExceptione){
Toast.makeText(this,R.string.unabletoopensoftware,
Toast.LENGTH_SHORT).show();
Log
.e(
TAG,
""
+intent
+".MakesuretocreateaMAINintent-"
+".",
e);
}
}