閱讀592 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何實現開機啟動、清緩存、殺進程、懸浮窗口單雙擊區分,附源碼

轉自https://www.cnblogs.com/Lefter/archive/2012/09/23/2699057.html


在本文,我們將實現以下功能:

  • 開機啟動
  • 清除緩存
  • 殺進程
  • 懸浮窗口的單雙擊
  • 統計RAM可用內存大小

一、開機啟動

  很多手機軟件具備開機啟動的功能,有時候讓軟件開機啟動會非常實用。那麼是如何實現開機啟動的呢?通過查找我們了解到開機後係統會發送一個啟動完畢的廣播,Intent.ACTION_BOOT_COMPLETED,那麼我們隻需要自定義一個BroadcastReciever接收這個廣播,在接收到廣播後啟動我們的程序就可以實現開機啟動了。

      以本程序中的MyBroadcastReceiver為例:

複製代碼
public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
            // 是否選擇了開機啟動
            boolean start = PreferenceManager.getDefaultSharedPreferences(
                    context).getBoolean(
                    CleanerActivity.KEY_START_WHEN_BOOT_COMPLETED, true);
            if (start) {
                Intent i = new Intent();
                i.setClass(context, FloatService.class);
                context.startService(i);
            }
        }
    }
}
複製代碼

  AndroidManifest.xml中的聲明如下:

 <receiver android:name="MyBroadcastReceiver" >
            <intent-filter>
                <action  android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
</receiver>

二、清除緩存

  在Android中Settings的源碼中使用了PackageManager的deleteApplicationCacheFiles()方法清除緩存,但是作為第三方軟件使用這個函數難度很大,我們在PackageManager中還發現freeStorageAndNotify()方法亦可實現清除緩存,而且第三方軟件使用時難度相對較小。因此,我們使用freeStorageAndNotify()方法來實現緩存的清理。

  使用freeStorageAndNotify()時需要在AndroidManifest.xml中聲明permission

<!-- 清除緩存時需要此權限 -->
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />

  該函數的具體使用可以參考源碼MyFloatView.java中的clearCache()函數。

三、殺進程

  在ActivityManager.java中為我們提供了killBackgroundProcesses(String packageName)函數來殺死進程具體如何殺死進程可以參考源碼MyFloatView.java中的killBackgroundProcess()函數。殺進程需要在AndroidManifest中聲明如下權限

<!-- 殺死進程時需要該權限 -->
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

四、懸浮窗口的單雙擊

  網上有很多實現懸浮窗口的教程,但是很少有人實現懸浮窗口的單擊和雙擊事件。在本程序中我們通過添加標誌位、記錄用戶點擊懸浮窗口時的時間、單擊和雙擊的響應使用多線程(使用Timer和TimerTask)等方式來判斷單擊和雙擊。在MyFloatView.java中的onTouchEvent()函數中對單雙擊進行判斷。

  區分單雙擊,是通過判斷兩次單擊的間隔來實現的。單擊事件的相應線程在執行前先進行一定時間的休眠等待判斷是否為雙擊,根據標誌位判斷執行是否執行單擊響應線程的函數。

五、統計RAM可用內存大小

  A:Android中的MemInfoReader類通過讀取/proc/meminfo實現了內存大小相關的函數,但第三方程序無法調用,我們將直接將MemInfoReader.java直接拷貝到項目中,作適當修改即可使用。

  B:通過MemoryInfo和ActivityManager獲得可用Ram內存大小

    ActivityManager am = (ActivityManager) this
                .getSystemService(Context.ACTIVITY_SERVICE);
        MemoryInfo mi = new MemoryInfo();
        am.getMemoryInfo(mi); // mi.availMem; 當前係統的可用內存
        Log.e("tag", "getMemoryInfo: " + mi.availMem);

源碼鏈接:https://pan.baidu.com/share/link?shareid=62428&uk=2953765628


最後更新:2017-04-02 15:15:03

  上一篇:go ibatis中的模煳查詢
  下一篇:go iPhone5要是能再大點就更好了