欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android應(yīng)用關(guān)閉的情況以及識(shí)別方法詳解

 更新時(shí)間:2022年06月09日 14:51:45   作者:陳小俠  
對(duì)于現(xiàn)在的安卓手機(jī)而言,很多功能都是在逐步完善的,這篇文章主要給大家介紹了關(guān)于Android應(yīng)用關(guān)閉的情況以及識(shí)別的相關(guān)資料,文章通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

引言

探討應(yīng)用關(guān)閉問(wèn)題的來(lái)由和應(yīng)用?;钍顷P(guān)聯(lián)的,特定類型的應(yīng)用如:

  • 聊天交友軟件
  • 軌跡記錄軟件
  • 企業(yè)內(nèi)部軟件
  • 硬件搭配手機(jī)應(yīng)用檢測(cè)軟件等等

這些應(yīng)用是需要保持長(zhǎng)時(shí)間在后臺(tái)運(yùn)行,當(dāng)應(yīng)用被關(guān)閉后,會(huì)造成數(shù)據(jù)缺失、不完整等問(wèn)題。通過(guò)記錄及分析應(yīng)用關(guān)閉原因,反向得出保活方案是否有效,進(jìn)而改進(jìn)方案以及提示用戶減少導(dǎo)致應(yīng)用關(guān)閉的行為。

哪些情況會(huì)導(dǎo)致應(yīng)用關(guān)閉

一、系統(tǒng)原因

  • 手機(jī)關(guān)機(jī)
  • 手機(jī)低電量、省電模式
  • 內(nèi)存不足
  • 廠商后臺(tái)管理或通過(guò)自帶的手機(jī)管家管理行為,如
    • 華為:應(yīng)用啟動(dòng)管理
    • 小米:神隱模式
    • OPPO:應(yīng)用速凍
    • VIVO:后臺(tái)高耗電
    • 三星:未監(jiān)視的應(yīng)用程序
    • 360:鎖屏清理、內(nèi)存加速
    • 魅族:后臺(tái)管理
    • 是否允許后臺(tái)運(yùn)行、鎖屏清理等等
    • 場(chǎng)景配置

二、用戶原因

  • 未需?;顮顟B(tài)下,用戶正常返回退出應(yīng)用
  • 手動(dòng)清理掉應(yīng)用
  • 使用其他第三方手機(jī)管理軟件,關(guān)閉應(yīng)用

三、應(yīng)用自身問(wèn)題

  • 出現(xiàn)BUG導(dǎo)致應(yīng)用關(guān)閉

識(shí)別方法

1、應(yīng)用自身Bug問(wèn)題

要說(shuō)寫(xiě)代碼沒(méi)有bug,只怕誰(shuí)都會(huì)說(shuō) 老子/臣妾做不到,識(shí)別方式就是通過(guò)第三方SDK或自己捕獲應(yīng)用Crash,及時(shí)修復(fù)。另外也可以添加相應(yīng)的代碼在發(fā)生Crash后重啟應(yīng)用。

2、手機(jī)關(guān)機(jī)

大概有3種情況會(huì)關(guān)機(jī)

  • 用戶主動(dòng)關(guān)機(jī)
  • 用戶設(shè)定了定時(shí)開(kāi)關(guān)機(jī)任務(wù)
  • 手機(jī)系統(tǒng)自動(dòng)更新,系統(tǒng)一般是默認(rèn)WLAN自動(dòng)下載新版本,且開(kāi)啟夜間自動(dòng)安裝功能。

識(shí)別方法:

  • AndroidManifest注冊(cè)靜態(tài)BroadcastReceiver監(jiān)聽(tīng)開(kāi)關(guān)機(jī)廣播事件。但是基本是無(wú)用,因?yàn)殚_(kāi)關(guān)機(jī)廣播被手機(jī)廠商屏蔽了,需要手動(dòng)設(shè)置打開(kāi)開(kāi)關(guān)后才能接收到。
<receiver
    android:name=".app.receiver.ShutdownReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="1000">
        <!-- 關(guān)機(jī)廣播 -->
        <action android:name="android.intent.action.ACTION_SHUTDOWN" />
        <!-- 手機(jī)啟動(dòng)完成監(jiān)聽(tīng) -->
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
  • 直接查看手機(jī)開(kāi)機(jī)累計(jì)時(shí)長(zhǎng)。在手機(jī)“設(shè)置”-“關(guān)于手機(jī)”-“狀態(tài)信息”里能查看手機(jī)的開(kāi)機(jī)累計(jì)時(shí)長(zhǎng)/已開(kāi)機(jī)時(shí)間,如果時(shí)間和應(yīng)用關(guān)閉時(shí)的時(shí)間段吻合,說(shuō)明是手機(jī)關(guān)機(jī)沒(méi)手動(dòng)啟動(dòng)應(yīng)用的緣故。

可以看出識(shí)別開(kāi)關(guān)機(jī)是比較有難度的

3、低電量、省電模式

手機(jī)電量低/省電模式下,系統(tǒng)會(huì)關(guān)閉非必要的應(yīng)用,以減少電量消耗。

識(shí)別方法: 通過(guò)獲取手機(jī)電量主觀判斷是否是低電量,如應(yīng)用在電量為30還在運(yùn)行,之后就沒(méi)有運(yùn)行記錄了,那可能是手機(jī)觸發(fā)省電模式被關(guān)閉了。華為手機(jī)可以通過(guò)代碼判斷是否處于省電模式。

手機(jī)電量可以通過(guò)注冊(cè)廣播監(jiān)聽(tīng)或者直接通過(guò)下列代碼獲取

public static int getBatteryLevel(Context context) {
    if(context == null){
        return -1;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        BatteryManager batteryManager = (BatteryManager) context.getSystemService(BATTERY_SERVICE);
        if (batteryManager == null) {
            return -1;
        }
        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
    } else {
        ContextWrapper wrapper = new ContextWrapper(context.getApplicationContext());
        Intent intent = wrapper.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        int power = -1;
        if(intent != null)power = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        return power;
    }
}

華為手機(jī)判斷省電模式PowerUtils.shouldShowPowerSaveModeOption(context),0為為開(kāi)省電模式,1省電模式。其他品牌手機(jī)暫無(wú)獲取方法。

public class PowerUtils {
    //華為電源管理(設(shè)置省電的地方)
    public static Intent getPowerSaveModeIntent() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.power.ui.HwPowerManagerActivity"));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        return intent;
    }
    /**
     * @param context
     * @return 1 省電模式
     */
    public static int shouldShowPowerSaveModeOption(Context context) {
        int a = b();
        if (a != 1) {
            return a;
        }
        try {
            ActivityInfo resolveActivityInfo = getPowerSaveModeIntent().resolveActivityInfo(context.getPackageManager(), 0);
            if (resolveActivityInfo == null || !resolveActivityInfo.exported) {
                return -1;
            }
            return a;
        } catch (Exception e) {
            return -1;
        }
    }
    private static boolean isHuaWeiDevice() {
        String brand = Build.BRAND;
        if (brand == null) return false;
        brand = brand.toLowerCase();
        if ("huawei".contains(brand)) {
            return true;
        }
        if ("magic".contains(brand)) {
            return true;
        }
        return "honor".contains(brand);
    }
    private static int b() {
        if (Build.VERSION.SDK_INT < 24 || !isHuaWeiDevice()) {// || !LoggerFactory.getDeviceProperty().isHuaweiDevice()
            return -1;
        }
        if (i()) {
            return 1;
        }
        return 0;
    }
    private static boolean i() {
        return "false".equals(d("persist.sys.performance"));
    }
    private static Method dd;
    private static String d(String str) {
        try {
            if (dd == null) {
                dd = Class.forName("android.os.SystemProperties").getMethod("get", new Class[]{String.class});
            }
            return (String) dd.invoke(null, new Object[]{str});
        } catch (Throwable th) {
            return null;
        }
    }
}

4、內(nèi)存不足

這里會(huì)有兩種情況,一種是應(yīng)用自身申請(qǐng)的內(nèi)存超過(guò)系統(tǒng)給APP默認(rèn)分配的內(nèi)存大小,需要優(yōu)化應(yīng)用自身內(nèi)存占用情況,如果真的需要大內(nèi)存,就使用largeHeap增加內(nèi)存的申請(qǐng)量

<application
     android:largeHeap="true">
</application>

另外一種情況是手機(jī)自身內(nèi)存不足,手機(jī)開(kāi)了太多其他軟件,導(dǎo)致系統(tǒng)回收關(guān)閉應(yīng)用。

識(shí)別方法: 開(kāi)發(fā)調(diào)試階段可以使用Android Profiler分析應(yīng)用內(nèi)存占用情況、LeakCanary檢測(cè)是否內(nèi)存泄漏;發(fā)布版由應(yīng)用Crash日志捕獲、以及在組件中注冊(cè)內(nèi)存回調(diào)監(jiān)聽(tīng)、或者使用第三方庫(kù)

//系統(tǒng)正運(yùn)行于低內(nèi)存的狀態(tài),應(yīng)用隨時(shí)可能被關(guān)閉
public void onLowMemory() {
}
//預(yù)示著你設(shè)備的內(nèi)存資源已經(jīng)開(kāi)始緊張,此時(shí)盡量釋放非必要內(nèi)存資源
public void onTrimMemory(int level) {
}

5、用戶正常返回退出應(yīng)用

非需后臺(tái)?;顣r(shí),用戶可以按返回鍵退出應(yīng)用,這個(gè)直接在退出時(shí)做日志記錄即可

6、廠商后臺(tái)管理與用戶手動(dòng)清理應(yīng)用

手動(dòng)清理掉應(yīng)用和廠商后臺(tái)應(yīng)用管理是相關(guān)聯(lián)的。這里的手動(dòng)清理指的是使用按鍵或手勢(shì)打開(kāi)的【最近應(yīng)用列表】頁(yè)面,然后點(diǎn)單獨(dú)劃掉應(yīng)用或者點(diǎn)擊一鍵清理應(yīng)用的行為。

最近應(yīng)用列表 

廠商后臺(tái)管理指的是 ,目前應(yīng)用想要后臺(tái)?;睿荒苁且龑?dǎo)用戶做好相應(yīng)的【后臺(tái)運(yùn)行權(quán)限設(shè)置】,而用戶是否設(shè)置正確是否打開(kāi)對(duì)應(yīng)的開(kāi)關(guān),沒(méi)有直接的回調(diào)方法,無(wú)法判斷。

識(shí)別方法:

雖然沒(méi)有直接的回調(diào)方法判斷用戶因【手動(dòng)清理】應(yīng)用及因沒(méi)有設(shè)置對(duì)【后臺(tái)運(yùn)行權(quán)限】而導(dǎo)致的應(yīng)用關(guān)閉,但是可以通過(guò)利用現(xiàn)有的監(jiān)聽(tīng)接口及分析用戶行為間接的判斷。

先說(shuō)現(xiàn)像:

  • 如果用戶沒(méi)有設(shè)置對(duì)【后臺(tái)運(yùn)行權(quán)限】,在【最近應(yīng)用列表】頁(yè)面一鍵清理時(shí),會(huì)將應(yīng)用清理關(guān)閉
  • 如果用戶沒(méi)有設(shè)置對(duì)【后臺(tái)運(yùn)行權(quán)限】,鎖屏后,過(guò)一段時(shí)間,應(yīng)用就會(huì)被自動(dòng)清理關(guān)閉

反過(guò)來(lái),如果設(shè)置對(duì)【后臺(tái)運(yùn)行權(quán)限】,一鍵清理時(shí),應(yīng)用不會(huì)被清理關(guān)閉;鎖屏后,應(yīng)用不會(huì)被清理關(guān)閉。

注:是否被清理掉是通過(guò)查看應(yīng)用的前臺(tái)通知服務(wù)是否存在確認(rèn)的

根據(jù)現(xiàn)像得出判斷方法:1、監(jiān)聽(tīng)手機(jī)鎖屏事件,鎖屏后,如果應(yīng)用不在運(yùn)行了,說(shuō)明是很可能是由于沒(méi)有設(shè)置對(duì)【后臺(tái)運(yùn)行權(quán)限】導(dǎo)致的應(yīng)用關(guān)閉

//動(dòng)態(tài)注冊(cè)開(kāi)鎖屏事件監(jiān)聽(tīng)
filter.addAction(Intent.ACTION_SCREEN_ON)
filter.addAction(Intent.ACTION_SCREEN_OFF)
filter.addAction(Intent.ACTION_USER_PRESENT)

2、監(jiān)聽(tīng)用戶打開(kāi)【最近應(yīng)用列表】頁(yè)面事件,如果是打開(kāi)最近應(yīng)用列表頁(yè)面后(如10s內(nèi)),應(yīng)用不在運(yùn)行的,說(shuō)明沒(méi)有設(shè)置對(duì)【后臺(tái)運(yùn)行權(quán)限】或者是用戶主動(dòng)清理關(guān)閉應(yīng)用。

////動(dòng)態(tài)注冊(cè)手機(jī)菜單、HOME鍵事件監(jiān)聽(tīng)
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)

困惑行為:引導(dǎo)用戶設(shè)置對(duì)后臺(tái)運(yùn)行權(quán)限是相當(dāng)考驗(yàn)產(chǎn)品文檔及客服人員事情,有的用戶其實(shí)已經(jīng)設(shè)置對(duì)后臺(tái)運(yùn)行權(quán)限了,但是應(yīng)用還是關(guān)閉了,原因是用戶覺(jué)得已經(jīng)設(shè)置了【自啟動(dòng)】【允許后臺(tái)運(yùn)行】應(yīng)用就會(huì)一直在后臺(tái)運(yùn)行,轉(zhuǎn)為做些主動(dòng)關(guān)閉應(yīng)用的操作,如:在應(yīng)用信息里點(diǎn)【強(qiáng)行停止】【結(jié)束運(yùn)行】及本文提到的其他導(dǎo)致應(yīng)用關(guān)閉的行為而沒(méi)有重新手動(dòng)再次打開(kāi)應(yīng)用。

其實(shí)做各種【后臺(tái)運(yùn)行權(quán)限】設(shè)置也只是告訴系統(tǒng)不要去清理關(guān)閉應(yīng)用,讓?xiě)?yīng)用在后臺(tái)運(yùn)行,但是如果用戶主動(dòng)去關(guān)閉應(yīng)用,系統(tǒng)還是會(huì)以用戶的想法為準(zhǔn)。用戶不想讓?xiě)?yīng)用運(yùn)行,那應(yīng)用就不能運(yùn)行。

7、其他原因

使用第三方應(yīng)用管理軟件、更改應(yīng)用權(quán)限、安裝新版本應(yīng)用、卸載應(yīng)用等等

最后

以上就是Android應(yīng)用關(guān)閉的情況及識(shí)別方法,不全不足之處或有更好的方法的還請(qǐng)廣大網(wǎng)友同學(xué)評(píng)論區(qū)留言指出

到此這篇關(guān)于Android應(yīng)用關(guān)閉的情況以及識(shí)別的文章就介紹到這了,更多相關(guān)Android應(yīng)用關(guān)閉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論