需求場(chǎng)景:在開(kāi)發(fā)一個(gè)語(yǔ)音通話功能的時(shí)候阅茶,用戶點(diǎn)擊Home鍵把a(bǔ)pp切換回后臺(tái)之后蛛枚,當(dāng)呼叫到來(lái),需要喚起后臺(tái)的app脸哀,并切回前臺(tái)(前提是app還沒(méi)有被系統(tǒng)干掉蹦浦,你懂的!)撞蜂。
很多手機(jī)只需要一句代碼就OK了!
context.startActivity(new Intent(context,XXXXActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
偏偏我國(guó)產(chǎn)大安卓喜歡搞事情盲镶,在OPPO?R9系列的手機(jī)就是怎樣都無(wú)法切回去前臺(tái)!沒(méi)辦法蝌诡,苦逼的我只能解決這問(wèn)題溉贿!
解決過(guò)程一:
//獲取ActivityManager
ActivityManager mAm = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//獲得當(dāng)前運(yùn)行的task
List<ActivityManager.RunningTaskInfo> taskList = mAm.getRunningTasks(20);
for(ActivityManager.RunningTaskInfo rti : taskList) {
????????//找到當(dāng)前應(yīng)用的task,并啟動(dòng)task的棧頂activity浦旱,達(dá)到程序切換到前臺(tái)
????????if(rti.topActivity.getPackageName().equals(context.getPackageName())) {
????????try{
????????????Intent resultIntent =newIntent(context,Class.forName(rti.topActivity.getClassName()));
????????????resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_SINGLE_TOP);
????????????context.startActivity(resultIntent);
????????}catch(ClassNotFoundException e) {
????????????e.printStackTrace();
????????}
????????break;
????}
}
運(yùn)行結(jié)果宇色,GG!其他手機(jī)都可以,就OPPO?R9s?不行宣蠕,好吧例隆,當(dāng)學(xué)習(xí)點(diǎn)記錄一下吧!畢竟也是一種喚起的方式抢蚀!
解決過(guò)程二(完美解決問(wèn)題):
//獲取ActivityManager
ActivityManager mAm = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//獲得當(dāng)前運(yùn)行的task
List<ActivityManager.RunningTaskInfo> taskList = mAm.getRunningTasks(100);
for(ActivityManager.RunningTaskInfo rti : taskList) {
????//找到當(dāng)前應(yīng)用的task镀层,并啟動(dòng)task的棧頂activity,達(dá)到程序切換到前臺(tái)
????if(rti.topActivity.getPackageName().equals(context.getPackageName())) {
????????Intent LaunchIntent =new Intent(Intent.ACTION_MAIN);
????????ComponentName cn =new ComponentName(Constant.PACKAGE,rti.topActivity.getClassName());
????????LaunchIntent.setComponent(cn);
????????startActivity(LaunchIntent);
????????break;
????}
}
親測(cè)有用皿曲,把公司所有的測(cè)試機(jī)都測(cè)試過(guò)鹿响,沒(méi)問(wèn)題!
PS:使用這段代碼的時(shí)候最好是判斷app在后臺(tái)之后才使用谷饿,在前臺(tái)的時(shí)候調(diào)用這段代碼,會(huì)導(dǎo)致這部分代碼之后的程序不執(zhí)行妈倔!
/-----------------------------------------------不明分割線-------------------------------------------------------/
OPPO?在R9系列以上的手機(jī)博投,除非用戶開(kāi)啟了“自啟動(dòng)”權(quán)限,否則你會(huì)在日志中看到一條攔截信息
OppoAppStartupManager: InterceptInfo com.gx.dfttsdk com.gx.dfttsdk com.gx.dfttsdk.MainActivity com.moban.baidu true
可以看OPPO?ColorOS官方社區(qū)的帖子:http://bbs.coloros.com/forum.php?mod=viewthread&tid=527188
這是OPPO?系統(tǒng)更新后的攔截操作盯蝴,禁止應(yīng)用私自喚起后臺(tái)應(yīng)用毅哗,除非獲得用戶允許!這個(gè)在其他廠家的手機(jī)也可以試一下捧挺,在應(yīng)用后臺(tái)切回前臺(tái)的操作上虑绵,開(kāi)啟“自啟動(dòng)”權(quán)限應(yīng)該是相通的!