Android Study之跳轉自啟動管理頁

2022-01-30 安卓巴士Android開發者門戶

作者

        本文由 靜心Study 投稿,博客地址:http://www.apkbus.com/myspaceblog-904057.html

LZ-Says:話說現在流氓軟體多不勝數,在反感的同時,我們確實應該從技術的角度去分析,為什麼他們能夠做到所謂的流氓呢?技術不分錯對,關鍵在於使用技術的人去如何運用相關技術~


前言

        話說,最近項目要求軟體自啟動,腦子一想,靜態註冊廣播,監聽用戶開機不就得了麼。按照思路編寫好代碼,卻發現怎麼都監聽不到這個開機權限。LZ很是鬱悶。經過幾天的諮詢度娘和各種腦洞大開的測試後,發現有個東東叫做自啟動管理,經過簡單測試後發現,用戶如果給定軟體自啟動權限後,我們只需要靜態註冊開機廣播就可以監聽到用戶開機,並可以針對這一情況做相關操作。


問題延伸

        但是問題又來了,那麼我們怎麼知道用戶是否給定軟體自啟動的權限呢?找了好久,沒找到可以解決的辦法,倒是有以下幾個辦法可以曲線救國,讓我們一塊來看看吧。

1. 靜態註冊廣播,本地保存標識。 主要監聽用戶開機和關機權限,如果監聽到開機權限,本地保存一個標識,證明用戶已給定這個權限;而監聽到關機的同時將這個標識置為空或者其他一個標識,表明認為用戶取消自啟動權限。但是這個有個問題我一直想不明白的是,加入一開始用戶設置了自啟動,但是通過其他手段又禁止自啟動,這時候怎麼辦?有點噁心。。。 
而關於廣播,有的人又提出監聽系統打電話,發簡訊,鬧鐘,等等。。。一系列監聽,感覺有點頭大。。。

2. 彈框提示用戶 
用戶首次登陸的時候,通過引導用戶去給本軟體設置自啟動權限。

。。。 。。。

還有一些其他的辦法,個人感覺不靠譜,就不一一細說了,感興趣的同志們可以自己找找~

        找了好久,噁心的不要不要的,最後索性直接給用戶提示吧,通過引導,讓用戶設置自啟動。那麼,讓我們先看一下效果圖吧~小的們,上圖~

        由於Android旗下各大手機廠商種類很多,我們第一步需要獲取到用戶當前使用的手機型號,然後根據相應的手機型號,去跳轉不同的自啟動界面,從而引導用戶設置我們的軟體自啟動權限。


介紹實現關鍵類

1.獲取手機型號(Build)

所屬包: android.os.Build
作用(含義): 從系統屬性中提取設備硬體和版本信息
靜態屬性:
1.1 BOARD 主板:The name of the underlying board, like goldfish.

        1.2 BOOTLOADER 系統啟動程序版本號:The system bootloader version number.
        1.3 BRAND 系統定製商:The consumer-visible brand with which the product/hardware will be associated, if any.
        1.4 CPU_ABI cpu指令集:The name of the instruction set (CPU type + ABI convention) of native code.
        1.5 CPU_ABI2 cpu指令集2:The name of the second instruction set (CPU type + ABI convention) of native code.
        1.6 DEVICE 設備參數:The name of the industrial design.
        1.7 DISPLAY 顯示屏參數:A build ID string meant for displaying to the user
        1.8 FINGERPRINT 唯一識別碼:A string that uniquely identifies this build. Do not attempt to parse this value.
        1.9 HARDWARE 硬體名稱:The name of the hardware (from the kernel command line or /proc).
        1.10 HOST
        1.11 ID 修訂版本列表:Either a changelist number, or a label like M4-rc20.
        1.12 MANUFACTURER 硬體製造商:The manufacturer of the product/hardware.(我們目前只需要關注這個靜態屬性即可)
        1.13 MODEL 版本即最終用戶可見的名稱:The end-user-visible name for the end product.
        1.14 PRODUCT 整個產品的名稱:The name of the overall product.
        1.15 RADIO 無線電固件版本:The radio firmware version number. 在API14後已過時。使用 getRadioVersion()代替。
        1.16 SERIAL 硬體序列號:A hardware serial number, if available. Alphanumeric only, case-insensitive.
        1.17 TAGS 描述build的標籤,如未籤名,debug等等。:Comma-separated tags describing the build, like unsigned,debug.
        1.18 TIME
        1.19 TYPE build的類型:The type of build, like user or eng.
        1.20 USER

2.打開其他應用程式中的Activity或服務(ComponentName)
所屬包: android.content.ComponentName
構造方法使用方式如下:
2.1 傳遞當前上下文和將要跳轉的類名;
2.2 傳遞一個String包名和String類名;
2.3 傳遞一個Parcel數據容器。
需要關注的方法:unflattenFromString("傳遞將要跳轉的地址,格式為包名/跳轉Activity Name")

        當然以上還包括一些未介紹的方法屬性,大家有興趣可以看一下~
        基本了解之後,讓我們一起開啟愉快的編碼之路吧~

創建MobileInfoUtils工具類

此工具類作用是獲取用戶手機型號,以及通過不同手機型號跳轉相應管理界面。

同時也為大家通過幾種不同方式去實現跳轉,大家可以仔細查看代碼~

package cn.hle.skipselfstartmanager.util;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Build;import android.provider.Settings;import android.util.Log;public class MobileInfoUtils {        private static String getMobileType() {        return Build.MANUFACTURER;    }        public static void jumpStartInterface(Context context) {        Intent intent = new Intent();        try {            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            Log.e("HLQ_Struggle", "******************當前手機型號為:" + getMobileType());            ComponentName componentName = null;            if (getMobileType().equals("Xiaomi")) {                componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity");            } else if (getMobileType().equals("Letv")) {                intent.setAction("com.letv.android.permissionautoboot");            } else if (getMobileType().equals("samsung")) {                componentName = new ComponentName("com.samsung.android.sm_cn", "com.samsung.android.sm.ui.ram.AutoRunActivity");            } else if (getMobileType().equals("HUAWEI")) {                componentName = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity");            } else if (getMobileType().equals("vivo")) {                componentName = ComponentName.unflattenFromString("com.iqoo.secure/.safeguard.PurviewTabActivity");            } else if (getMobileType().equals("Meizu")) {                                                componentName = ComponentName.unflattenFromString("com.meizu.safe/.permission.PermissionMainActivity");            } else if (getMobileType().equals("OPPO")) {                componentName = ComponentName.unflattenFromString("com.oppo.safe/.permission.startup.StartupAppListActivity");            } else if (getMobileType().equals("ulong")) {                componentName = new ComponentName("com.yulong.android.coolsafe", ".ui.activity.autorun.AutoRunListActivity");            } else {                                                                if (Build.VERSION.SDK_INT >= 9) {                    intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");                    intent.setData(Uri.fromParts("package", context.getPackageName(), null));                } else if (Build.VERSION.SDK_INT <= 8) {                    intent.setAction(Intent.ACTION_VIEW);                    intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");                    intent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());                }            }            intent.setComponent(componentName);            context.startActivity(intent);        } catch (Exception e) {            intent = new Intent(Settings.ACTION_SETTINGS);            context.startActivity(intent);        }    }}

        

        寫完之後,大家可能會有疑問,LZ你是通過什麼方式得知的具體包名呢?
        哈,有些是Android小夥伴友情贊助,有些是通過adb命令獲取,再次為大家介紹下通過adb獲取跳轉包名。

        通過adb獲取跳轉包名路徑

        adb為我們提供了一個可以列印出當前系統所有service信息,在後面可加上具體的服務名的牛掰命令,那就是如下:

adb shell dumpsys

        在此為大家拓展一些常用的基於dumpsys命令:

獲取設備電池信息:adb shell dumpsys battery

獲取cpu信息:adb shell dumpsys cpuinfo

獲取內存信息:adb shell dumpsys meminfo

        要獲取具體應用的內存信息,可加上包名 adb shell dumpsys meminfo PACKAGE_NAME

獲取Activity信息:adb shell dumpsys activity

獲取package信息:adb shell dumpsys package

加上-h可以獲取幫助信息
        獲取某個包的信息:adb shell dumpsys package PACKAGE_NAME

獲取通知信息:adb shell dumpsys notification

獲取wifi信息:adb shell dumpsys wifi

        可以獲取到當前連接的wifi名、搜索到的wifi列表、wifi強度等

獲取電源管理信息:adb shell dumpsys power

        可以獲取到是否處於鎖屏狀態:mWakefulness=Asleep或者mScreenOn=false

獲取電話信息:adb shell dumpsys telephony.registry

        可以獲取到電話狀態,例如mCallState值為0,表示待機狀態、1表示來電未接聽狀態、2表示電話佔線狀態
mCallForwarding=false #是否啟用呼叫轉移
mDataConnectionState=2 #0:無數據連接 1:正在創建數據連接 2:已連接mDataConnectionPossible=true #是否有數據連接mDataConnectionApn= #APN名稱等

        而我們將通過以下命令獲取當前在棧頂Activity包名:

adb shell dumpsys activity top

        看命令行字面的意思也就是獲取當前在棧頂Activity信息(就是咱能看到的界面的具體信息)。

        那麼接下來拿LZ紅米Note4為大家仔細講解,我們如何通過命令行獲取位置界面的包名路徑。

使用adb獲取位置界麵包名路徑詳情

        1.連接手機,手動打開系統自啟動管理界面,之後打開Android Studio,點擊下方Terminal,輸入以上命令,查看信息,如下圖:

        我們看到列印出n條信息,但是對我們有用的只是紅色區域內,大家這次懂了吧~

        在相應的Activity調用,引導用戶設置自啟動

        在此,簡單寫為點擊按鈕,彈框,確認跳轉自啟動管理界面。兄弟們有具體需求在具體考慮實現吧~

package cn.hle.skipselfstartmanager;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Bundle;import android.view.View;import cn.hle.skipselfstartmanager.util.MobileInfoUtils;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void gotoSelfStartingManager(View view){        jumpStartInterface();    }        private void jumpStartInterface() {        try {            AlertDialog.Builder builder = new AlertDialog.Builder(this);            builder.setMessage(R.string.app_user_auto_start);            builder.setPositiveButton("立即設置",                    new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            MobileInfoUtils.jumpStartInterface(MainActivity.this);                        }                    });            builder.setNegativeButton("暫時不設置",                    new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            dialog.dismiss();                        }                    });            builder.setCancelable(false);            builder.create().show();        } catch (Exception e) {        }    }}

                附上三星Note5以及魅族4運行跳轉的結果工具類中只有360手機未測試,其他的測試通過。

三星Note5點擊後跳轉如下:

2.魅族4點擊後跳轉如下:


demo地址

查看Demo源碼地址:https://github.com/HLQ-Struggle/SkipSelfStartManager


===============這是一條神奇的分割線===================

        w3812127大兄弟指出在oppo r9s 自啟動項的包位置發生變化,並給出了更新後的coding,感謝~在此做一下補充。

("OPPO")) { // OPPO R8205測試通過

componentName =ComponentName.unflattenFromString("com.oppo.safe/.permission.startup.StartupAppListActivity");
Intent intentOppo = new Intent();
intentOppo.setClassName("com.oppo.safe/.permission.startup", "StartupAppListActivity");
if (context.getPackageManager().resolveActivity(intentOppo, 0) == null) {
componentName =ComponentName.unflattenFromString("com.coloros.safecenter/.startupapp.StartupAppListActivity");
}


結束語

        努力了,還不夠,不放棄,才為真。願大家幹的順心,擼的開心,玩的舒心~我們一起努力!

使用Kotlin來開發Android,愛上它的優雅

Kotlin學習資料大匯總

玩轉GreenDao 3.2.2 點滴提升逼格~

史上最詳細的Toolbar開發講解,此篇必讀!

        歡迎大家到安卓巴士論壇博文專區發表博文,優秀的文章我們會進行多渠道推薦。

相關焦點

  • Android App Shortcuts
    快捷鍵可讓您的用戶在應用程式中快速啟動常見或推薦的任務。每個快捷鍵引用一個或多個意圖,每個意圖在用戶選擇快捷方式時在應用程式中啟動特定操作。可以表達為快捷方式的操作示例包括:在跳轉頁面時將用戶導航到特定位置。在通訊應用程式中傳送訊息給朋友。在媒體應用中播放電視節目的下一集。在遊戲應用程式中加載最後一個保存點。
  • 【資源大全】Android開源項目庫匯總二
    - 標籤布局FlowLayoutDemo★19 - 自定義View實現流式布局TextViewHTextView★3017 - 支持自定義字體的TextView動畫效果android-autofittextview★2678 - 自動改變文字大小完美適應邊界ticker★2405 - 顯示滾動文本
  • Android用戶態啟動流程分析
    Android從系統啟動的4個步驟,如下所示:  1.init進程啟動  2.Native服務啟動  3.System Server、Android服務啟動  4.Home啟動從硬體上電啟動到終端軟體可用是一個漫長而複雜的過程,我們在開心享受著豐富的應用程式時候,可能並沒想到這其中所包含的工程師心血
  • Android系統啟動之init進程(二)-「Android取經之路」
    上一節主要講了Init進程的整體架構,以及Kernel啟動的部分內容。
  • Android 架構之 Jetpack ViewModel 解讀
    ViewModel介紹 ViewModel的定義:ViewModel旨在以注重生命周期的方式存儲和管理界面相關的數據。><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http
  • Android系統啟動流程
    再看看上述啟動過程圖,可以看到內核中主要啟動了兩個進程:swapper進程(pid=0),該進程又稱為idle進程, 系統初始化過程Kernel由無到有開創的第一個進程, 用於初始化進程管理、內存管理。並且會加載屏幕硬體,相機硬體等,這一步就會涉及到待會說到的HAL層了。
  • 你知道Android Nougat (牛軋糖)有哪些新鮮口味嗎?
    性能JIT編譯器、VR模式、Vulkan™ API使用新的JIT編輯器的系統及應用有更快的啟動速度,同時使用更少的內存,在系統更新時你再也不會有「Android is upgrading」的過程;VR模式對之後會發布的DayDream會有更好的支持;Vulkan™ API 是一款新的3D渲染API,使遊戲應用擁有更絢麗的顯示效果和渲染效率
  • 超簡單實現Android自定義Toast
    看效果先:簡單三步,我們現在就開始自定義一下吧!(一)、Layout:要自定義Toast,首先我們需要一個XML布局。但是在布局之前我們需要三個資源文件,分別是背景、√和×。背景可以用XML畫出來:toast_back.xml<?
  • 面試進階之Activity啟動過程
    系統啟動開啟的服務系統的會在啟動時也可以認為開機時啟動常用的服務,如ActivityManagerService(AMS),PackageManagerService(PMS),WindowManagerService(WMS),以及ServiceManager(SM),用於管理各種服務。
  • 掌握 Android 系統架構,看這一篇就夠了!| 技術頭條
    當然本站有一些文章沒來得及進一步加工,有時間根據大家的反饋,不斷修正和完善所有文章,爭取給文章,再進一步精簡非核心代碼,增加可視化圖表以及文字的結論性分析。基於Android 6.0的源碼,專注於分享Android系統原理、架構分析的原創文章。
  • Android模擬器之Genymotion
    android模擬器中速度最快的,也就是genymotion,另外VS2015中,微軟自帶的android模擬器運行速度確實可以(感興趣的同學可以嘗試),今天重點介紹genymotion的安裝以及配置,使用。
  • Flutter完整開發實戰詳解(十九、 Android 和 iOS 打包提交審核指南)
    另外需要注意,Android 上需要在 android/app/src/build.gradle 下配置 signingConfigs 來指定打包密鑰等信息,具體生成密鑰這裡就不詳說,之後把 signingConfigs 配置到 buildTypes 就完成配置。
  • Android系統persist應用自動啟動
    在Android系統寫app時,在AndroidManifest.xml裡有這樣一個屬性:android:persistent
  • Android 上百實例源碼分析以及開源分析
    21、OssSystem(OA系統圖書管理簡單版)簡單的實現了圖書管理的系統,主要還是UI設計,其中封裝了一個類與伺服器交流。22、QQ_UI之分類菜單DEMO,ListView內嵌GridView的實現。
  • Android逆向實戰之smali彙編
    在AndroidManifest文件中,有這樣一段代碼: <activity android:configChanges="keyboard|keyboardHidden|navigation|orientation|screenSize" android:label="@string/app_name" android:launchMode
  • DASCTF八月挑戰賽 Android 逆向 apkrev
    IDA 分析 so 文件把 so 文件(x86)扔進 IDA,並在函數窗口搜索 myCheck 函數,雙擊跳轉,F5,從返回開始看起:用腳本將 enc 複製出來。在 IDA 中按快捷鍵 Shift + F2:
  • Android系統列印方案分析
    ><permissions>  <feature name="android.software.print" /></permissions>增加這個xml文件之後,adb shell 「stop && start」重啟SystemServer,SystemServer就會默認啟動PrintMangerService服務:
  • 探討Android6.0及以上系統APP保活實現
    等待20分鐘,進程沒有被殺死,"咕咚"跑步界面自動彈出,運動狀態保持不變; 前提:手機管家->鎖屏清理應用"關閉;手機管家->自啟管理"關閉;運動狀態,禁用返回鍵,用戶只能從Home鍵退到後臺;運動界面文字閃爍或運動計時;斷網;分析:當"咕咚"處於停止狀態時,一鍵清理和黑屏狀態會被殺死
  • Android 中更靈活的依賴之 VersionLint
    本文轉載自公眾號:樹下胖鱷上次分享了一篇 Android 中更靈活的依賴,能夠更方便統一的管理版本,後來發現在 .java、.kt 文件中的依賴信息居然不支持新版提示。回顧在 .gradle 文件中管理依賴的日子,我們可以得到一個版本升級提示,如下圖所示。
  • 眾多Android開源控制項庫收藏分享
    https://github.com/liaoinstan/SpringViewhttps://github.com/lubeast/PullToRefreshhttps://github.com/Frank-Zhu/PullZoomViewhttps://github.com/JorgeCastilloPrz/ExpandablePanel引導頁