如何实现开机启动、清缓存、杀进程、悬浮窗口单双击区分,附源码
在本文,我们将实现以下功能:
- 开机启动
- 清除缓存
- 杀进程
- 悬浮窗口的单双击
- 统计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);
源码链接:http://pan.baidu.com/share/link?shareid=62428&uk=2953765628