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

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

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

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

步骤包括:

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

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

注册receiver:

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

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

注册 service:

  1. <serviceandroid:name="TimerService"/>

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

1.NoUIRebootDemoActivity .java

  1. packagecom.NoUIRebootDemo.main;
  2. importjava.util.List;
  3. importandroid.app.Activity;
  4. importandroid.app.ActivityManager;
  5. importandroid.app.ActivityManager.RunningServiceInfo;
  6. importandroid.content.Context;
  7. importandroid.content.Intent;
  8. importandroid.os.Bundle;
  9. importandroid.view.View;
  10. importandroid.view.View.OnClickListener;
  11. importandroid.widget.Button;
  12. publicclassNoUIRebootDemoActivityextendsActivity{
  13. /**Calledwhentheactivityisfirstcreated.*/
  14. @Override
  15. publicvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. Buttonstop=(Button)findViewById(R.id.stop);
  19. stop.setOnClickListener(stopClick);
  20. }
  21. //事件响应
  22. OnClickListenerstopClick=newOnClickListener(){
  23. @Override
  24. publicvoidonClick(Viewv){
  25. //TODOAuto-generatedmethodstub
  26. //如果服务线程存在
  27. if(isServiceRun(NoUIRebootDemoActivity.this)){
  28. Intents=newIntent(NoUIRebootDemoActivity.this,
  29. TimerService.class);
  30. NoUIRebootDemoActivity.this.stopService(s);
  31. System.out.println("服务线程手动停止");
  32. }
  33. }
  34. };
  35. //判断服务线程是否存在
  36. publicstaticbooleanisServiceRun(Contextcontext){
  37. ActivityManageram=(ActivityManager)context
  38. .getSystemService(Context.ACTIVITY_SERVICE);
  39. List<RunningServiceInfo>list=am.getRunningServices(30);
  40. for(RunningServiceInfoinfo:list){
  41. if(info.service.getClassName().equals(
  42. "com.NoUIRebootDemo.main.TimerService")){
  43. returntrue;
  44. }
  45. }
  46. returnfalse;
  47. }
  48. }

2.TimerReceiver .java

  1. packagecom.NoUIRebootDemo.main;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. publicclassTimerReceiverextendsBroadcastReceiver{
  6. @Override
  7. publicvoidonReceive(Contextcontext,Intentintent){
  8. //TODOAuto-generatedmethodstub
  9. //启动Service
  10. Intents=newIntent(context,TimerService.class);
  11. context.startService(s);
  12. System.out.println("Receiverstart");
  13. }
  14. }

3.TimerService .java

  1. packagecom.NoUIRebootDemo.main;
  2. importjava.text.SimpleDateFormat;
  3. importjava.util.Date;
  4. importjava.util.Timer;
  5. importjava.util.TimerTask;
  6. importandroid.app.Service;
  7. importandroid.content.Intent;
  8. importandroid.os.IBinder;
  9. importandroid.util.Log;
  10. publicclassTimerServiceextendsService{
  11. //定时器
  12. privateTimermTimer;
  13. privateTimerTaskmTimerTask;
  14. privateinti=0;
  15. @Override
  16. publicIBinderonBind(Intentintent){
  17. //TODOAuto-generatedmethodstub
  18. returnnull;
  19. }
  20. @Override
  21. publicvoidonCreate(){
  22. super.onCreate();
  23. //执行的Service
  24. //定时器执行
  25. mTimer=newTimer();
  26. mTimerTask=newTimerTask(){
  27. @Override
  28. publicvoidrun(){
  29. //打印出时间
  30. Log.d("AndroidTimerDemo","timer:"+formatDate());
  31. //这里设置一个自己停止的功能
  32. if(i>2){
  33. Intents=newIntent(TimerService.this,
  34. TimerService.class);
  35. stopService(s);
  36. System.out.println("服务线程自动停止");
  37. }
  38. System.out.println("服务线程执行次数:"+i);
  39. i++;
  40. }
  41. };
  42. mTimer.schedule(mTimerTask,10000,10000);
  43. }
  44. @Override
  45. publicvoidonDestroy(){
  46. //TODOAuto-generatedmethodstub
  47. System.out.println("onDestroy");
  48. mTimer.cancel();
  49. super.onDestroy();
  50. }
  51. //输出时间
  52. publicStringformatDate(){
  53. SimpleDateFormatdateFormat=newSimpleDateFormat(
  54. "yyyy-MM-ddHH:mm:ss");
  55. Strings=dateFormat.format(newDate());
  56. returns;
  57. }
  58. }

4.main.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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. <Buttonandroid:id="@+id/stop"
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="手动停止服务"/>
  10. </LinearLayout>

5.AndroidManifest.xml

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

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

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


上一篇: 编写本地服务和Activity交互的示例

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

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

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

步骤包括:

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

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

注册receiver:

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

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

注册 service:

  1. <serviceandroid:name="TimerService"/>

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

1.NoUIRebootDemoActivity .java

  1. packagecom.NoUIRebootDemo.main;
  2. importjava.util.List;
  3. importandroid.app.Activity;
  4. importandroid.app.ActivityManager;
  5. importandroid.app.ActivityManager.RunningServiceInfo;
  6. importandroid.content.Context;
  7. importandroid.content.Intent;
  8. importandroid.os.Bundle;
  9. importandroid.view.View;
  10. importandroid.view.View.OnClickListener;
  11. importandroid.widget.Button;
  12. publicclassNoUIRebootDemoActivityextendsActivity{
  13. /**Calledwhentheactivityisfirstcreated.*/
  14. @Override
  15. publicvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. Buttonstop=(Button)findViewById(R.id.stop);
  19. stop.setOnClickListener(stopClick);
  20. }
  21. //事件响应
  22. OnClickListenerstopClick=newOnClickListener(){
  23. @Override
  24. publicvoidonClick(Viewv){
  25. //TODOAuto-generatedmethodstub
  26. //如果服务线程存在
  27. if(isServiceRun(NoUIRebootDemoActivity.this)){
  28. Intents=newIntent(NoUIRebootDemoActivity.this,
  29. TimerService.class);
  30. NoUIRebootDemoActivity.this.stopService(s);
  31. System.out.println("服务线程手动停止");
  32. }
  33. }
  34. };
  35. //判断服务线程是否存在
  36. publicstaticbooleanisServiceRun(Contextcontext){
  37. ActivityManageram=(ActivityManager)context
  38. .getSystemService(Context.ACTIVITY_SERVICE);
  39. List<RunningServiceInfo>list=am.getRunningServices(30);
  40. for(RunningServiceInfoinfo:list){
  41. if(info.service.getClassName().equals(
  42. "com.NoUIRebootDemo.main.TimerService")){
  43. returntrue;
  44. }
  45. }
  46. returnfalse;
  47. }
  48. }

2.TimerReceiver .java

  1. packagecom.NoUIRebootDemo.main;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. publicclassTimerReceiverextendsBroadcastReceiver{
  6. @Override
  7. publicvoidonReceive(Contextcontext,Intentintent){
  8. //TODOAuto-generatedmethodstub
  9. //启动Service
  10. Intents=newIntent(context,TimerService.class);
  11. context.startService(s);
  12. System.out.println("Receiverstart");
  13. }
  14. }

3.TimerService .java

  1. packagecom.NoUIRebootDemo.main;
  2. importjava.text.SimpleDateFormat;
  3. importjava.util.Date;
  4. importjava.util.Timer;
  5. importjava.util.TimerTask;
  6. importandroid.app.Service;
  7. importandroid.content.Intent;
  8. importandroid.os.IBinder;
  9. importandroid.util.Log;
  10. publicclassTimerServiceextendsService{
  11. //定时器
  12. privateTimermTimer;
  13. privateTimerTaskmTimerTask;
  14. privateinti=0;
  15. @Override
  16. publicIBinderonBind(Intentintent){
  17. //TODOAuto-generatedmethodstub
  18. returnnull;
  19. }
  20. @Override
  21. publicvoidonCreate(){
  22. super.onCreate();
  23. //执行的Service
  24. //定时器执行
  25. mTimer=newTimer();
  26. mTimerTask=newTimerTask(){
  27. @Override
  28. publicvoidrun(){
  29. //打印出时间
  30. Log.d("AndroidTimerDemo","timer:"+formatDate());
  31. //这里设置一个自己停止的功能
  32. if(i>2){
  33. Intents=newIntent(TimerService.this,
  34. TimerService.class);
  35. stopService(s);
  36. System.out.println("服务线程自动停止");
  37. }
  38. System.out.println("服务线程执行次数:"+i);
  39. i++;
  40. }
  41. };
  42. mTimer.schedule(mTimerTask,10000,10000);
  43. }
  44. @Override
  45. publicvoidonDestroy(){
  46. //TODOAuto-generatedmethodstub
  47. System.out.println("onDestroy");
  48. mTimer.cancel();
  49. super.onDestroy();
  50. }
  51. //输出时间
  52. publicStringformatDate(){
  53. SimpleDateFormatdateFormat=newSimpleDateFormat(
  54. "yyyy-MM-ddHH:mm:ss");
  55. Strings=dateFormat.format(newDate());
  56. returns;
  57. }
  58. }

4.main.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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. <Buttonandroid:id="@+id/stop"
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="手动停止服务"/>
  10. </LinearLayout>

5.AndroidManifest.xml

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值