android开机启动无界面服务线程
http://www.yoyong.com/archives/450
android的开机启动某项功能很常见操作。很多时候我们往往只是需要开机启动一项服务,而不是将整个应用程序开启。这个时候只是需要启动一个service的服务就可以达到效果。开启一项后台服务后,我们还应该对该项服务进行控制,例如停止该线程服务。停止该服务可以按照一定的条件让服务线程自动关闭,也可以人为的手动关闭。
下面要实现以上这样的功能。
步骤包括:
1.建立一个android的项目,并且创建一个主要的Activity类(NoUIRebootDemoActivity.java )该类只有一个Button按钮,用来手动停止后台服务线程的。
2.创建一个继承BroadcastReceiver的广播类(TimerReceiver.java),该类通知Service类执行相应的代码。
注册receiver:
- <receiverandroid:name=".TimerReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- <categoryandroid:name="android.intent.category.HOME"/>
- </intent-filter>
- </receiver>
3.创建一个继承Service类(TimerService.java ),该类主要执行后台的操作。这里主要执行一个定时打印时间代码的功能,并且执行三次后停止服务,并重写Service的onDestroy()方法,取消定时器,停止执行Service。
注册 service:
- <serviceandroid:name="TimerService"/>
在手动调用停止线程服务之前,可以判断当前的线程服务是否存在,如果存在,则停止该服务线程。
1.NoUIRebootDemoActivity .java
- packagecom.NoUIRebootDemo.main;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.app.ActivityManager;
- importandroid.app.ActivityManager.RunningServiceInfo;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- publicclassNoUIRebootDemoActivityextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Buttonstop=(Button)findViewById(R.id.stop);
- stop.setOnClickListener(stopClick);
- }
- //事件响应
- OnClickListenerstopClick=newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- //如果服务线程存在
- if(isServiceRun(NoUIRebootDemoActivity.this)){
- Intents=newIntent(NoUIRebootDemoActivity.this,
- TimerService.class);
- NoUIRebootDemoActivity.this.stopService(s);
- System.out.println("服务线程手动停止");
- }
- }
- };
- //判断服务线程是否存在
- publicstaticbooleanisServiceRun(Contextcontext){
- ActivityManageram=(ActivityManager)context
- .getSystemService(Context.ACTIVITY_SERVICE);
- List<RunningServiceInfo>list=am.getRunningServices(30);
- for(RunningServiceInfoinfo:list){
- if(info.service.getClassName().equals(
- "com.NoUIRebootDemo.main.TimerService")){
- returntrue;
- }
- }
- returnfalse;
- }
- }
2.TimerReceiver .java
- packagecom.NoUIRebootDemo.main;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- publicclassTimerReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- //TODOAuto-generatedmethodstub
- //启动Service
- Intents=newIntent(context,TimerService.class);
- context.startService(s);
- System.out.println("Receiverstart");
- }
- }
3.TimerService .java
- packagecom.NoUIRebootDemo.main;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importjava.util.Timer;
- importjava.util.TimerTask;
- importandroid.app.Service;
- importandroid.content.Intent;
- importandroid.os.IBinder;
- importandroid.util.Log;
- publicclassTimerServiceextendsService{
- //定时器
- privateTimermTimer;
- privateTimerTaskmTimerTask;
- privateinti=0;
- @Override
- publicIBinderonBind(Intentintent){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicvoidonCreate(){
- super.onCreate();
- //执行的Service
- //定时器执行
- mTimer=newTimer();
- mTimerTask=newTimerTask(){
- @Override
- publicvoidrun(){
- //打印出时间
- Log.d("AndroidTimerDemo","timer:"+formatDate());
- //这里设置一个自己停止的功能
- if(i>2){
- Intents=newIntent(TimerService.this,
- TimerService.class);
- stopService(s);
- System.out.println("服务线程自动停止");
- }
- System.out.println("服务线程执行次数:"+i);
- i++;
- }
- };
- mTimer.schedule(mTimerTask,10000,10000);
- }
- @Override
- publicvoidonDestroy(){
- //TODOAuto-generatedmethodstub
- System.out.println("onDestroy");
- mTimer.cancel();
- super.onDestroy();
- }
- //输出时间
- publicStringformatDate(){
- SimpleDateFormatdateFormat=newSimpleDateFormat(
- "yyyy-MM-ddHH:mm:ss");
- Strings=dateFormat.format(newDate());
- returns;
- }
- }
4.main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <Buttonandroid:id="@+id/stop"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="手动停止服务"/>
- </LinearLayout>
5.AndroidManifest.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.NoUIRebootDemo.main"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdkandroid:minSdkVersion="7"/>
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name=".NoUIRebootDemoActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <serviceandroid:name="TimerService"/>
- <receiverandroid:name=".TimerReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- <categoryandroid:name="android.intent.category.HOME"/>
- </intent-filter>
- </receiver>
- </application>
- </manifest>
需要注意一点:每次修改程序,都要先执行一次该程序(安装apk到模拟器),然后关闭模拟器,重新启动模拟器。
下图可以看到在后台运行的服务程序
http://www.yoyong.com/archives/450
android的开机启动某项功能很常见操作。很多时候我们往往只是需要开机启动一项服务,而不是将整个应用程序开启。这个时候只是需要启动一个service的服务就可以达到效果。开启一项后台服务后,我们还应该对该项服务进行控制,例如停止该线程服务。停止该服务可以按照一定的条件让服务线程自动关闭,也可以人为的手动关闭。
下面要实现以上这样的功能。
步骤包括:
1.建立一个android的项目,并且创建一个主要的Activity类(NoUIRebootDemoActivity.java )该类只有一个Button按钮,用来手动停止后台服务线程的。
2.创建一个继承BroadcastReceiver的广播类(TimerReceiver.java),该类通知Service类执行相应的代码。
注册receiver:
- <receiverandroid:name=".TimerReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- <categoryandroid:name="android.intent.category.HOME"/>
- </intent-filter>
- </receiver>
3.创建一个继承Service类(TimerService.java ),该类主要执行后台的操作。这里主要执行一个定时打印时间代码的功能,并且执行三次后停止服务,并重写Service的onDestroy()方法,取消定时器,停止执行Service。
注册 service:
- <serviceandroid:name="TimerService"/>
在手动调用停止线程服务之前,可以判断当前的线程服务是否存在,如果存在,则停止该服务线程。
1.NoUIRebootDemoActivity .java
- packagecom.NoUIRebootDemo.main;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.app.ActivityManager;
- importandroid.app.ActivityManager.RunningServiceInfo;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- publicclassNoUIRebootDemoActivityextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Buttonstop=(Button)findViewById(R.id.stop);
- stop.setOnClickListener(stopClick);
- }
- //事件响应
- OnClickListenerstopClick=newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- //如果服务线程存在
- if(isServiceRun(NoUIRebootDemoActivity.this)){
- Intents=newIntent(NoUIRebootDemoActivity.this,
- TimerService.class);
- NoUIRebootDemoActivity.this.stopService(s);
- System.out.println("服务线程手动停止");
- }
- }
- };
- //判断服务线程是否存在
- publicstaticbooleanisServiceRun(Contextcontext){
- ActivityManageram=(ActivityManager)context
- .getSystemService(Context.ACTIVITY_SERVICE);
- List<RunningServiceInfo>list=am.getRunningServices(30);
- for(RunningServiceInfoinfo:list){
- if(info.service.getClassName().equals(
- "com.NoUIRebootDemo.main.TimerService")){
- returntrue;
- }
- }
- returnfalse;
- }
- }
2.TimerReceiver .java
- packagecom.NoUIRebootDemo.main;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- publicclassTimerReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- //TODOAuto-generatedmethodstub
- //启动Service
- Intents=newIntent(context,TimerService.class);
- context.startService(s);
- System.out.println("Receiverstart");
- }
- }
3.TimerService .java
- packagecom.NoUIRebootDemo.main;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importjava.util.Timer;
- importjava.util.TimerTask;
- importandroid.app.Service;
- importandroid.content.Intent;
- importandroid.os.IBinder;
- importandroid.util.Log;
- publicclassTimerServiceextendsService{
- //定时器
- privateTimermTimer;
- privateTimerTaskmTimerTask;
- privateinti=0;
- @Override
- publicIBinderonBind(Intentintent){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicvoidonCreate(){
- super.onCreate();
- //执行的Service
- //定时器执行
- mTimer=newTimer();
- mTimerTask=newTimerTask(){
- @Override
- publicvoidrun(){
- //打印出时间
- Log.d("AndroidTimerDemo","timer:"+formatDate());
- //这里设置一个自己停止的功能
- if(i>2){
- Intents=newIntent(TimerService.this,
- TimerService.class);
- stopService(s);
- System.out.println("服务线程自动停止");
- }
- System.out.println("服务线程执行次数:"+i);
- i++;
- }
- };
- mTimer.schedule(mTimerTask,10000,10000);
- }
- @Override
- publicvoidonDestroy(){
- //TODOAuto-generatedmethodstub
- System.out.println("onDestroy");
- mTimer.cancel();
- super.onDestroy();
- }
- //输出时间
- publicStringformatDate(){
- SimpleDateFormatdateFormat=newSimpleDateFormat(
- "yyyy-MM-ddHH:mm:ss");
- Strings=dateFormat.format(newDate());
- returns;
- }
- }
4.main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <Buttonandroid:id="@+id/stop"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="手动停止服务"/>
- </LinearLayout>
5.AndroidManifest.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.NoUIRebootDemo.main"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdkandroid:minSdkVersion="7"/>
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name=".NoUIRebootDemoActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <serviceandroid:name="TimerService"/>
- <receiverandroid:name=".TimerReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- <categoryandroid:name="android.intent.category.HOME"/>
- </intent-filter>
- </receiver>
- </application>
- </manifest>
需要注意一点:每次修改程序,都要先执行一次该程序(安装apk到模拟器),然后关闭模拟器,重新启动模拟器。
下图可以看到在后台运行的服务程序