這篇文章將為大家詳細(xì)講解有關(guān)Android中怎么根據(jù)包名判斷App運(yùn)行狀態(tài),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)建站專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)、網(wǎng)站重做改版、黃浦網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為黃浦等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
背景
可以根據(jù) App 是否有 Service 分兩類(lèi)情況處理:
① 沒(méi)有 Service
② 有 Service
對(duì)于沒(méi)有 Service 的 App,程序一旦切換到后臺(tái),可能很快就被回收了,這里使用 ActivityManager.getRunningTasks(int maxNum)
方法來(lái)獲取當(dāng)前正在運(yùn)行的任務(wù),注意:此方法并不被系統(tǒng)推薦,且是一個(gè) Deprecated 的方法。
對(duì)于有 Service 的 App,大多會(huì)有多個(gè) Service ,且有可能都是 :remote 類(lèi)型的,這樣在判斷上需要進(jìn)行一定的處理,這里根據(jù) App 的 uid 來(lái)判斷,避免在一些特殊的情況下判斷存活不準(zhǔn)確的問(wèn)題。我們使用 ActivityManager.getRunningServices(int maxNum)
方法獲取當(dāng)前運(yùn)行中的 Service 列表。
注意:App 的 uid 對(duì)于系統(tǒng)內(nèi)置 App 而言不是唯一的,Android 內(nèi)置的應(yīng)用會(huì)有共用 uid 的情況。如果你是開(kāi)發(fā)系統(tǒng)內(nèi)置應(yīng)用或者類(lèi)似的東西,務(wù)必要自行進(jìn)行特殊方式檢查。
實(shí)現(xiàn)
下面是幾個(gè)工具類(lèi),在正式使用的時(shí)候需要配合使用,才能覆蓋全部情況:
/** * 方法描述:判斷某一應(yīng)用是否正在運(yùn)行 * Created by cafeting on 2017/2/4. * @param context 上下文 * @param packageName 應(yīng)用的包名 * @return true 表示正在運(yùn)行,false 表示沒(méi)有運(yùn)行 */ public static boolean isAppRunning(Context context, String packageName) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100); if (list.size() <= 0) { return false; } for (ActivityManager.RunningTaskInfo info : list) { if (info.baseActivity.getPackageName().equals(packageName)) { return true; } } return false; } //獲取已安裝應(yīng)用的 uid,-1 表示未安裝此應(yīng)用或程序異常 public static int getPackageUid(Context context, String packageName) { try { ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(packageName, 0); if (applicationInfo != null) { Logger.d(applicationInfo.uid); return applicationInfo.uid; } } catch (Exception e) { return -1; } return -1; } /** * 判斷某一 uid 的程序是否有正在運(yùn)行的進(jìn)程,即是否存活 * Created by cafeting on 2017/2/4. * * @param context 上下文 * @param uid 已安裝應(yīng)用的 uid * @return true 表示正在運(yùn)行,false 表示沒(méi)有運(yùn)行 */ public static boolean isProcessRunning(Context context, int uid) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> runningServiceInfos = am.getRunningServices(200); if (runningServiceInfos.size() > 0) { for (ActivityManager.RunningServiceInfo appProcess : runningServiceInfos){ if (uid == appProcess.uid) { return true; } } } return false; }
在正式使用的時(shí)候結(jié)合兩者即可:
String pName = "xxx"; int uid = getPackageUid(context, pName); if(uid > 0){ boolean rstA = isAppRunning(context, pName); boolean rstB = isProcessRunning(context, uid); if(rstA||rstB){ //指定包名的程序正在運(yùn)行中 }else{ //指定包名的程序未在運(yùn)行中 } }else{ //應(yīng)用未安裝 }
關(guān)于Android中怎么根據(jù)包名判斷App運(yùn)行狀態(tài)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章名稱(chēng):Android中怎么根據(jù)包名判斷App運(yùn)行狀態(tài)
網(wǎng)頁(yè)路徑:http://www.ekvhdxd.cn/article18/iijcgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站導(dǎo)航、定制網(wǎng)站、網(wǎng)站收錄、響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)