android开机启动无界面服务线程

http://www.yoyong.com/archives/450

android的开机启动某项功能很常见操作。很多时候我们往往只是需要开机启动一项服务,而不是将整个应用程序开启。这个时候只是需要启动一个service的服务就可以达到效果。开启一项后台服务后,我们还应该对该项服务进行控制,例如停止该线程服务。停止该服务可以按照一定的条件让服务线程自动关闭,也可以人为的手动关闭。

下面要实现以上这样的功能。

步骤包括:

1.建立一个android的项目,并且创建一个主要的Activity类(NoUIRebootDemoActivity.java )该类只有一个Button按钮,用来手动停止后台服务线程的。

2.创建一个继承BroadcastReceiver的广播类(TimerReceiver.java),该类通知Service类执行相应的代码。

注册receiver:

  1. <receiver android:name=".TimerReceiver">  
  2. <intent-filter>  
  3. <action android:name="android.intent.action.BOOT_COMPLETED"/>  
  4. <category android:name="android.intent.category.HOME" />  
  5. </intent-filter>  
  6. </receiver>  

3.创建一个继承Service类(TimerService.java ),该类主要执行后台的操作。这里主要执行一个定时打印时间代码的功能,并且执行三次后停止服务,并重写Service的onDestroy()方法,取消定时器,停止执行Service。

注册 service:

  1. <service android:name ="TimerService" />  

在手动调用停止线程服务之前,可以判断当前的线程服务是否存在,如果存在,则停止该服务线程。

1.NoUIRebootDemoActivity .java

  1. package com.NoUIRebootDemo.main;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.ActivityManager;  
  7. import android.app.ActivityManager.RunningServiceInfo;  
  8. import android.content.Context;  
  9. import android.content.Intent;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14.   
  15. public class NoUIRebootDemoActivity extends Activity {  
  16. /** Called when the activity is first created. */  
  17. @Override  
  18. public void onCreate(Bundle savedInstanceState) {  
  19. super.onCreate(savedInstanceState);  
  20. setContentView(R.layout.main);  
  21. Button stop = (Button) findViewById(R.id.stop);  
  22. stop.setOnClickListener(stopClick);  
  23. }  
  24.   
  25. // 事件响应  
  26. OnClickListener stopClick = new OnClickListener() {  
  27.   
  28. @Override  
  29. public void onClick(View v) {  
  30. // TODO Auto-generated method stub  
  31. // 如果服务线程存在  
  32. if (isServiceRun(NoUIRebootDemoActivity.this)) {  
  33. Intent s = new Intent(NoUIRebootDemoActivity.this,  
  34. TimerService.class);  
  35. NoUIRebootDemoActivity.this.stopService(s);  
  36. System.out.println("服务线程手动停止");  
  37. }  
  38. }  
  39. };  
  40.   
  41. // 判断服务线程是否存在  
  42. public static boolean isServiceRun(Context context) {  
  43. ActivityManager am = (ActivityManager) context  
  44. .getSystemService(Context.ACTIVITY_SERVICE);  
  45. List<RunningServiceInfo> list = am.getRunningServices(30);  
  46. for (RunningServiceInfo info : list) {  
  47. if (info.service.getClassName().equals(  
  48. "com.NoUIRebootDemo.main.TimerService")) {  
  49. return true;  
  50. }  
  51. }  
  52. return false;  
  53. }  
  54. }  

2.TimerReceiver .java

  1. package com.NoUIRebootDemo.main;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6.   
  7. public class TimerReceiver extends BroadcastReceiver {  
  8.   
  9. @Override  
  10. public void onReceive(Context context, Intent intent) {  
  11. // TODO Auto-generated method stub  
  12. // 启动Service  
  13. Intent s = new Intent(context, TimerService.class);  
  14. context.startService(s);  
  15. System.out.println("Receiver start");  
  16. }  
  17. }  

3.TimerService .java

  1. package com.NoUIRebootDemo.main;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.Timer;  
  6. import java.util.TimerTask;  
  7.   
  8. import android.app.Service;  
  9. import android.content.Intent;  
  10. import android.os.IBinder;  
  11. import android.util.Log;  
  12.   
  13. public class TimerService extends Service {  
  14.   
  15. // 定时器  
  16. private Timer mTimer;  
  17. private TimerTask mTimerTask;  
  18. private int i = 0;  
  19.   
  20. @Override  
  21. public IBinder onBind(Intent intent) {  
  22. // TODO Auto-generated method stub  
  23. return null;  
  24. }  
  25.   
  26. @Override  
  27. public void onCreate() {  
  28. super.onCreate();  
  29. // 执行的Service  
  30. // 定时器执行  
  31. mTimer = new Timer();  
  32. mTimerTask = new TimerTask() {  
  33. @Override  
  34. public void run() {  
  35. // 打印出时间  
  36. Log.d("AndroidTimerDemo""timer:" + formatDate());  
  37. // 这里设置一个自己停止的功能  
  38. if (i > 2) {  
  39. Intent s = new Intent(TimerService.this,  
  40. TimerService.class);  
  41. stopService(s);  
  42. System.out.println("服务线程自动停止");  
  43. }  
  44. System.out.println("服务线程执行次数:" + i);  
  45. i++;  
  46. }  
  47. };  
  48. mTimer.schedule(mTimerTask, 1000010000);  
  49. }  
  50.   
  51. @Override  
  52. public void onDestroy() {  
  53. // TODO Auto-generated method stub  
  54. System.out.println("onDestroy");  
  55. mTimer.cancel();  
  56. super.onDestroy();  
  57. }  
  58. // 输出时间  
  59. public String formatDate() {  
  60. SimpleDateFormat dateFormat = new SimpleDateFormat(  
  61. "yyyy-MM-dd HH:mm:ss");  
  62. String s = dateFormat.format(new Date());  
  63. return s;  
  64. }  
  65. }  

4.main.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3. android:orientation="vertical"  
  4. android:layout_width="fill_parent"  
  5. android:layout_height="wrap_content" >  
  6. <Button android:id="@+id/stop"  
  7. android:layout_width="fill_parent"  
  8. android:layout_height="wrap_content"  
  9. android:text="手动停止服务" />  
  10. </LinearLayout>  

5.AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3. package="com.NoUIRebootDemo.main"  
  4. android:versionCode="1"  
  5. android:versionName="1.0">  
  6. <uses-sdk android:minSdkVersion="7" />  
  7. <application android:icon="@drawable/icon" android:label="@string/app_name">  
  8. <activity android:name=".NoUIRebootDemoActivity"  
  9. android:label="@string/app_name">  
  10. <intent-filter>  
  11. <action android:name="android.intent.action.MAIN" />  
  12. <category android:name="android.intent.category.LAUNCHER" />  
  13. </intent-filter>  
  14. </activity>  
  15. <service android:name ="TimerService" />  
  16. <receiver android:name=".TimerReceiver">  
  17. <intent-filter>  
  18. <action android:name="android.intent.action.BOOT_COMPLETED"/>  
  19. <category android:name="android.intent.category.HOME" />  
  20. </intent-filter>  
  21. </receiver>  
  22. </application>  
  23. </manifest>  

需要注意一点:每次修改程序,都要先执行一次该程序(安装apk到模拟器),然后关闭模拟器,重新启动模拟器。

下图可以看到在后台运行的服务程序


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值