Android跳轉到第三方app毫玖,運行時長監(jiān)聽

1. 問題描述

需要實現(xiàn)從我們app跳轉到第三方app廉沮,并統(tǒng)計第三方app在前臺所待時長的功能逮壁。

2. 問題分析

大概過程如下:
1)首先得有權限孵坚,我們這個需要實現(xiàn)允許查看應用使用情況懸浮窗兩個權限窥淆。
2)跳轉到第三方app卖宠;
3)啟動一個服務監(jiān)聽;
4)彈出一個懸浮窗
5)監(jiān)聽第三方app是否在前臺運行忧饭。實現(xiàn)思路是啟動一個定時器扛伍,每隔1s去查看前臺應用信息。
6)預期時間完成词裤,銷毀懸浮窗刺洒,解綁Service汁咏。

3. 實現(xiàn)過程

3.1 懸浮窗
  • 懸浮窗權限
    當我們自己app在后臺運行時,無法彈出一個Toast或者Dialog作媚,所以得做一個類似于360安全衛(wèi)士一樣的懸浮窗攘滩。所以得要申請懸浮窗權限。6.0之前只需要在AndroidManifest文件中申請:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>

6.0之后纸泡,代碼中動態(tài)申請漂问,需要跳轉到系統(tǒng)設置中去獲取:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
    if (!Settings.canDrawOverlays(MainActivity.this)){
         Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
         startActivityForResult(intent, REQUESTCODE_OVER);
    }
}
  • 顯示一個懸浮窗
    顯示一個懸浮窗女揭,首先寫一個布局文件蚤假,然后添加到WindowManager中。
    // LayoutInflater.from中Context用getApplicationContext()
    View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_window,null);
    WindowManager mWindowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    //設置type.系統(tǒng)提示型窗口吧兔,一般都在應用程序窗口之上.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    }else{
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    }
    //設置效果為背景透明.
    params.format = PixelFormat.RGBA_8888;
    //設置flags.不可聚焦及不可使用按鈕對懸浮窗進行操控.
    params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

    //設置窗口初始土籽觯靠位置.
    params.gravity = Gravity.LEFT | Gravity.TOP;
    params.x = 0;
    params.y = 0;

    params.width = WindowManager.LayoutParams.MATCH_PARENT;
    params.height = WindowManager.LayoutParams.WRAP_CONTENT;

    mWindowManager.addView(view,params);

注意:在Android 8.0后 params.type變化。具體參考: Android 8.0 懸浮窗變動與用法

3.2 監(jiān)聽app在前臺運行

Android檢測app運行在前臺境蔼,5.0以前是通過獲取手機當前活躍進程列表灶平,5.0后這種辦法用不了了,5.0以后通過UsageStatsManager(統(tǒng)計服務類)來獲取箍土。

1)5.0之前

通過ActivityManager獲取運行app進程來判斷app是否處于前臺逢享。

public boolean isRunningForeground(Context context,String packageName){
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> processes = activityManager.getRunningAppProcesses();
    for (ActivityManager.RunningAppProcessInfo processInfo: processes) {

        if (processInfo.processName.equals(context.getPackageName())) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return true;
            }
        }
    }
    return false;
}
2)5.0之后

Android5.0之后通過UsageStatsManager(統(tǒng)計服務類)

  • 申請“允許查看應用使用情況”。
    5.0以后查看應用使用情況
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions"/>

在代碼中吴藻,我們也做一層判斷瞒爬,是否已經獲取該權限,如果沒有沟堡,則跳轉到設置權限界面:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivityForResult(intent,REQUESTCODE_USAGE);
  • 獲取最近運行app
public String getRunningPackageNameOver21(Context context){
    String topPackageName = "";
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){
        return topPackageName;
    }
    // 1.獲取統(tǒng)計服務類
    UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
    long currTime = System.currentTimeMillis();
    //2.獲取從今天0點到現(xiàn)在的使用情況
    List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, getStartTime(),currTime);
    //3.根據(jù)最后使用時間降序排列
    Collections.sort(usageStatsList,new UsageComparator());

    //獲取前臺應用侧但,排除其他應用因通知欄而產生的統(tǒng)計信息
    Field mLastEventField = null;
    try {
        mLastEventField = UsageStats.class.getField("mLastEvent");
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
    for (UsageStats usageStats:usageStatsList){
        if (mLastEventField != null){
            int lastEvent = 0;
            try {
                lastEvent =  mLastEventField.getInt(usageStats);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

            if (lastEvent == 1){
                topPackageName = usageStats.getPackageName();
//                        Log.i(TAG,"包名:" + usageStats.getPackageName() + ",:" + dateFormat.format(new Date(date)));
                return topPackageName;
            }
        }
    }
    return topPackageName;
}

4. 最后效果

device-2018-03-30-155006.gif

源碼:https://github.com/AnXy1218/AppRunTime

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市航罗,隨后出現(xiàn)的幾起案子禀横,更是在濱河造成了極大的恐慌,老刑警劉巖伤哺,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燕侠,死亡現(xiàn)場離奇詭異,居然都是意外死亡立莉,警方通過查閱死者的電腦和手機绢彤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓耻,“玉大人茫舶,你說我怎么就攤上這事∩蔡剩” “怎么了饶氏?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵讥耗,是天一觀的道長。 經常有香客問我疹启,道長古程,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任喊崖,我火速辦了婚禮挣磨,結果婚禮上,老公的妹妹穿的比我還像新娘荤懂。我一直安慰自己茁裙,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布节仿。 她就那樣靜靜地躺著晤锥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廊宪。 梳的紋絲不亂的頭發(fā)上矾瘾,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音挤忙,去河邊找鬼霜威。 笑死谈喳,一個胖子當著我的面吹牛册烈,可吹牛的內容都是我干的。 我是一名探鬼主播婿禽,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼赏僧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扭倾?” 一聲冷哼從身側響起淀零,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膛壹,沒想到半個月后驾中,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡模聋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年肩民,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链方。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡持痰,死狀恐怖,靈堂內的尸體忽然破棺而出祟蚀,到底是詐尸還是另有隱情工窍,我是刑警寧澤割卖,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站患雏,受9級特大地震影響鹏溯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜淹仑,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一剿涮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧攻人,春花似錦取试、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓬坡,卻和暖如春猿棉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屑咳。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工萨赁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兆龙。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓杖爽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紫皇。 傳聞我的和親對象是個殘疾皇子慰安,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348