Android 進程蓖缍活系列:(一)利用 Activity 提升權(quán)限

最近公司有進程鄙涓唬活方面的業(yè)務(wù)需求膝迎,所以就趁著閑暇時間研究了相關(guān)的技術(shù)方案限次,并且親身驗證它們的可行性柴灯,接下來我會用幾篇文章詳細介紹卖漫。

之前就有人爆出手機 QQ 長久存活的秘訣赠群,那就是 監(jiān)聽用戶的解鎖屏操作,在鎖屏的時候啟動一個像素的透明窗口的 Activity店枣,在解鎖的時候把 Activity 銷毀叹誉。 不得不佩服鵝廠的程序猿,竟然能想出這么棒的方案长豁!管你 Android 怎么升級,該方案真的是屢試不爽钝侠!用戶無感知酸舍,目的達到了,兩全其美的事情啃勉。

首先驗證一下:在鎖屏狀態(tài)下 cmd 輸入

adb shell dumpsys activity activities

我們來看一下 dump 的輸出:最頂層的 Task 的信息,包名:com.tencent.reading叮阅,我看了一下應(yīng)用列表,它是「天天快報」浩姥,果然是騰訊家的。

dump 輸出

我們看到 OffActicity 就是頂層的 Activity兜挨,懷著好奇心找到了源碼所在的目錄缴饭,參考相關(guān)代碼,自己寫了一個 demo颗搂。

具體實現(xiàn)分兩步:

  1. 創(chuàng)建一個透明的 Activity
  2. 監(jiān)聽用戶解鎖屏操作
第一步:創(chuàng)建一個透明的 Activity

1. 在 onCreate 方法中設(shè)置 window 的屬性

Window window = getWindow();
window.setGravity(Gravity.TOP | Gravity.LEFT);
LayoutParams attributes = window.getAttributes();
attributes.x = 0;
attributes.y = 0;
attributes.height = 1;
attributes.width = 1;
window.setAttributes(attributes);

2. 在 Manifest 中設(shè)置一些屬性丢氢,包括排除在最近任務(wù)列表外、透明主題疚察、啟動模式等

<activity
    android:name="com.silence.keeplive.onepx.OnePxActivity"    
    android:excludeFromRecents="true"
    android:exported="false"
    android:finishOnTaskLaunch="false"
    android:launchMode="singleInstance"
    android:process=":main"
    android:theme="@android:style/Theme.Translucent"    
    android:configChanges="keyboardHidden|orientation|screenSize" />

3. 處理觸摸和銷毀事件
因為 Activity 是在鎖屏的時候啟動的,所以在用戶點亮屏幕后比驻,它是絕對不能存在的岛抄。我們要在 Activity 的生命周期里做些處理。為了穩(wěn)妥起見夫椭,對 Activity 的觸摸事件我們也要處理,直接銷毀 Activity 就可以了扰付。

@Override
protected void onResume() {    
  super.onResume();    
  if (isScreenOn()) {       
      finishSelf();    
  }
}

@Override
protected void onDestroy() {    
  super.onDestroy();    
  if (instance != null && instance.get() == this) {        
    instance = null;   
  }
}

public void finishSelf() {    
  if (!isFinishing()) {        
    finish();    
  }  
}

private boolean isScreenOn() {    
    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);        
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {            
        return powerManager.isInteractive();        
    } else {            
        return powerManager.isScreenOn();        
     }    
 }
第二步:監(jiān)聽用戶解鎖屏操作

實現(xiàn)該功能要注冊三個廣播:

<action android:name="android.intent.action.USER_PRESENT"/>
<action android:name="android.intent.action.SCREEN_ON"/>
<action android:name="android.intent.action.SCREEN_OFF"/>

但是這里有一個問題仁讨,USER_PRESENT 可以靜態(tài)注冊,其余兩個只能通過動態(tài)注冊才能收到廣播禽翼。我們索性把這三個廣播都動態(tài)和靜態(tài)注冊一次,反正不會有什么壞處闰挡。然后接收到開關(guān)屏廣播事件礁哄,對 Activity 做處理。

if ("android.intent.action.SCREEN_OFF".equals(action)) {    
    Log.i(TAG, "鎖屏開啟一像素");
    CheckTopTask.setForeground(context);    
    mHandler.postDelayed(mCheckTopTask, 3000);
} else if ("android.intent.action.USER_PRESENT".equals(action) || "android.intent.action.SCREEN_ON".equals(action)) {   
    Log.i(TAG, "開屏關(guān)閉一像素");    
    OnePxActivity onePxActivity = OnePxActivity.instance != null ? OnePxActivity.instance.get() : null;   
    if (onePxActivity != null) {        
        onePxActivity.finishSelf();   
    }    
    mHandler.removeCallbacks(mCheckTopTask);
}

這里有一個很雞賊的地方夺脾,既然鎖屏?xí)r已經(jīng)啟動了透明 Activity茉继,為什么還要再三秒后還要執(zhí)行一個任務(wù)?因為擔(dān)心其他應(yīng)用也采用同樣的方案烁竭,把它的 Activity 蓋在我們的上面。這個任務(wù)就是在三秒后檢測當前 Activity 是否在前臺婉弹,如果不在就再次啟動终吼,獲得前臺的焦點。我看騰訊就是這么搞的际跪,大寫的「服」!

最后實現(xiàn)的功能是 Activity 為我們占據(jù)前臺良姆,保證進程不被殺死穴肘,后臺的 Service 在辛勤工作歇盼,目的達到了评抚,so happy ~~

項目地址:AndroidKeepPractive

參考鏈接:

【騰訊Bugly干貨分享】Android 進程笨活招式大全

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侍匙,隨后出現(xiàn)的幾起案子叮雳,更是在濱河造成了極大的恐慌妇汗,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寞焙,死亡現(xiàn)場離奇詭異互婿,居然都是意外死亡,警方通過查閱死者的電腦和手機慈参,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門驮配,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人僧凤,你說我怎么就攤上這事⌒牛” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵验懊,是天一觀的道長尸变。 經(jīng)常有香客問我,道長碱工,這世上最難降的妖魔是什么奏夫? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮廊谓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒸痹。我一直安慰自己,他們只是感情好叠荠,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布蝙叛。 她就那樣靜靜地躺著,像睡著了一般借帘。 火紅的嫁衣襯著肌膚如雪淌铐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天际起,我揣著相機與錄音吐葱,去河邊找鬼街望。 笑死弟跑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的哎甲。 我是一名探鬼主播饲嗽,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼貌虾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衔憨,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晚唇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哩陕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赫舒,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡接癌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年扣讼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭符。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡销钝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒸健,到底是詐尸還是另有隱情,我是刑警寧澤似忧,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布盯捌,位于F島的核電站淳衙,受9級特大地震影響挽唉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匠童,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一塑顺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧严拒,春花似錦、人聲如沸裤唠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坦辟,卻和暖如春章办,著一層夾襖步出監(jiān)牢的瞬間锉走,已是汗流浹背藕届。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工休偶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嚣潜,地道東北人椅贱。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓只冻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親山橄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評論 25 707
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-androi...
    eddy_wiki閱讀 3,273評論 0 20
  • 如何進行進程保活混移,首先我們應(yīng)該先分析一下進程被殺死的原因開始 Android進程被殺死的場景分析: 從 Andro...
    如穎隨行日記閱讀 4,914評論 2 4
  • 為了面試歌径,為了高工資毁嗦,廢話不多說,不定期更新回铛。 1. Activity正常和異常情況下的生命周期分析克锣。 Activ...
    24K男閱讀 834評論 0 0
  • 小品里的大娘說:沒了就真的沒了……淚水奪眶而出饼酿,我想我的外婆,想到外公走了以后的這一年多時間故俐,外婆一個人在那...
    flying毛毛閱讀 367評論 1 3