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

Android應用關閉的情況以及識別方法詳解

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

引言

探討應用關閉問題的來由和應用?;钍顷P聯(lián)的,特定類型的應用如:

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

這些應用是需要保持長時間在后臺運行,當應用被關閉后,會造成數(shù)據(jù)缺失、不完整等問題。通過記錄及分析應用關閉原因,反向得出?;罘桨甘欠裼行ВM而改進方案以及提示用戶減少導致應用關閉的行為。

哪些情況會導致應用關閉

一、系統(tǒng)原因

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

二、用戶原因

  • 未需保活狀態(tài)下,用戶正常返回退出應用
  • 手動清理掉應用
  • 使用其他第三方手機管理軟件,關閉應用

三、應用自身問題

  • 出現(xiàn)BUG導致應用關閉

識別方法

1、應用自身Bug問題

要說寫代碼沒有bug,只怕誰都會說 老子/臣妾做不到,識別方式就是通過第三方SDK或自己捕獲應用Crash,及時修復。另外也可以添加相應的代碼在發(fā)生Crash后重啟應用。

2、手機關機

大概有3種情況會關機

  • 用戶主動關機
  • 用戶設定了定時開關機任務
  • 手機系統(tǒng)自動更新,系統(tǒng)一般是默認WLAN自動下載新版本,且開啟夜間自動安裝功能。

識別方法:

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

可以看出識別開關機是比較有難度的

3、低電量、省電模式

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

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

手機電量可以通過注冊廣播監(jiān)聽或者直接通過下列代碼獲取

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;
    }
}

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

public class PowerUtils {
    //華為電源管理(設置省電的地方)
    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、內存不足

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

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

另外一種情況是手機自身內存不足,手機開了太多其他軟件,導致系統(tǒng)回收關閉應用。

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

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

5、用戶正常返回退出應用

非需后臺?;顣r,用戶可以按返回鍵退出應用,這個直接在退出時做日志記錄即可

6、廠商后臺管理與用戶手動清理應用

手動清理掉應用和廠商后臺應用管理是相關聯(lián)的。這里的手動清理指的是使用按鍵或手勢打開的【最近應用列表】頁面,然后點單獨劃掉應用或者點擊一鍵清理應用的行為。

最近應用列表 

廠商后臺管理指的是 ,目前應用想要后臺?;?,只能是引導用戶做好相應的【后臺運行權限設置】,而用戶是否設置正確是否打開對應的開關,沒有直接的回調方法,無法判斷。

識別方法:

雖然沒有直接的回調方法判斷用戶因【手動清理】應用及因沒有設置對【后臺運行權限】而導致的應用關閉,但是可以通過利用現(xiàn)有的監(jiān)聽接口及分析用戶行為間接的判斷。

先說現(xiàn)像:

  • 如果用戶沒有設置對【后臺運行權限】,在【最近應用列表】頁面一鍵清理時,會將應用清理關閉
  • 如果用戶沒有設置對【后臺運行權限】,鎖屏后,過一段時間,應用就會被自動清理關閉

反過來,如果設置對【后臺運行權限】,一鍵清理時,應用不會被清理關閉;鎖屏后,應用不會被清理關閉。

注:是否被清理掉是通過查看應用的前臺通知服務是否存在確認的

根據(jù)現(xiàn)像得出判斷方法:1、監(jiān)聽手機鎖屏事件,鎖屏后,如果應用不在運行了,說明是很可能是由于沒有設置對【后臺運行權限】導致的應用關閉

//動態(tài)注冊開鎖屏事件監(jiān)聽
filter.addAction(Intent.ACTION_SCREEN_ON)
filter.addAction(Intent.ACTION_SCREEN_OFF)
filter.addAction(Intent.ACTION_USER_PRESENT)

2、監(jiān)聽用戶打開【最近應用列表】頁面事件,如果是打開最近應用列表頁面后(如10s內),應用不在運行的,說明沒有設置對【后臺運行權限】或者是用戶主動清理關閉應用。

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

困惑行為:引導用戶設置對后臺運行權限是相當考驗產(chǎn)品文檔及客服人員事情,有的用戶其實已經(jīng)設置對后臺運行權限了,但是應用還是關閉了,原因是用戶覺得已經(jīng)設置了【自啟動】【允許后臺運行】應用就會一直在后臺運行,轉為做些主動關閉應用的操作,如:在應用信息里點【強行停止】【結束運行】及本文提到的其他導致應用關閉的行為而沒有重新手動再次打開應用。

其實做各種【后臺運行權限】設置也只是告訴系統(tǒng)不要去清理關閉應用,讓應用在后臺運行,但是如果用戶主動去關閉應用,系統(tǒng)還是會以用戶的想法為準。用戶不想讓應用運行,那應用就不能運行。

7、其他原因

使用第三方應用管理軟件、更改應用權限、安裝新版本應用、卸載應用等等

最后

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

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

相關文章

最新評論