前两做了个开机自动启动的功能,今天来整理一下。希望能有用的上的朋友。不费话,直接上代码
Manifest.xml文件:
<service android:name=".DaemonService" android:enabled="true" android:process=".DaemonService" > <intent-filter android:priority="1000"> <action android:name="cn.test.DaemonService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
注释:因为我们这个服务要一直在后台运行,所以不采用bindService的方式,而是直接采用startService的方式。
这样就不至于我们的程序结束,也把我们的服务也结束掉了。
package cn.start.test; import java.util.List; import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.Service; import android.app.ActivityManager.RunningAppProcessInfo; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.util.Log; public class DaemonService extends Service { private static final String TAG = "Alarmreceiver"; Handler hd1 = new Handler(); int delay = 5000; public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @SuppressLint("NewApi") public void onCreate() { System.out.println("服务启动成功。。。。。。。。。。"); hd1.postDelayed(mTasks, delay); } private Runnable mTasks = new Runnable() { @SuppressLint("NewApi") public void run() { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND); if (checkMainAppIsActive()) { Log.d(TAG, "服务检测主应用还在运行"); } else { Log.d(TAG, "服务检测主应用已经关闭"); Intent intent = getPackageManager().getLaunchIntentForPackage( "cn.start.test"); if (intent != null) { DaemonService.this.startActivity(intent); Log.d(TAG, "服务启动主应用程序。"); } else { Log.d(TAG, "服务检测到没有安装主应用,自动退出。"); return; } } hd1.postDelayed(mTasks, delay); } }; /** * 检测是否主程序是否还在运行 * @return */ @SuppressLint({ "NewApi", "NewApi" }) public boolean checkMainAppIsActive(){ ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); //获取正在运行的应用 List<RunningAppProcessInfo> run = am.getRunningAppProcesses(); for(RunningAppProcessInfo ra : run){ if(ra.processName.equals("cn.start.test")){ return true; } } return false; } }
开机自动启动程序,自然少不了开机启动广播了。
manifest.xml 文件:
<receiver android:name=".StartupReceiver" > <intent-filter android:priority="1000" > <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
public class StartupReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Intent i = new Intent(context,LoginActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); Intent serviceIntent = new Intent(context,DaemonService.class); context.startService(serviceIntent); } }
总结:开机启动广播一定在manifest文件中注册好。定时器要注意定时延迟。
通过List<RunningAppProcessInfo> run = am.getRunningAppProcesses();判断自己的进程是否还在运行
通过getPackageManager().getLaunchIntentForPackage( "cn.start.test"); getPackageManager().getLaunchIntentForPackage( "cn.start.test");
来启动自己的程序。