大四实习准备6_android服务

2015-5-9

1.服务是什么

2.Android多线程编程

3.服务的基本用法

3.1定义服务

1)创建myService类,使其继承Service类,

2)再实现onBind()方法(用于活动和服务的绑定),重写onCreate()(服务创建时调用)、onStratCommand(服务启动时调用)、onDestroy()方法(服务销毁时调用)。

3)每一个服务(事实上是四大组件)都需在AndroidManifest.xml中注册才能生效

3.2启动和停止服务

借助Intent。

启动:

1 Intent startIntent = new Intent(this,myService.class);
2 startService(startIntent);//启动服务

首次执行startService(startIntent)后,myService中的onCreate()方法、onStratCommand()方法会依次执行。

而之后再执行startService(startIntent)(执行stopService()之后?还是直接再次执行startService()?),只有onStratCommand()方法会执行。

因为该服务已经创建过了,就不执行onCreate()方法了。

停止:

1.

1 Intent stopIntent = new Intent(this,myService.class);
2 stopService(startIntent);//停止服务

onDestroy()方法会执行。

2.

或者,服务也可以自己使自己停止下来,即在myService类中的某个位置调用stopSelf()方法也能停止服务。

3.3活动和服务进行通信

 利用myServiece类中的onBind()方法。

//...

4.服务的生命周期

1.startService()----stopService()/stopSelf()

技术分享

技术分享

2.bindService()----unbindService()

3.startService() && bindService() ---- stopService() && unbindService() (?:或者直接stopSelf(),没试验过)

5.服务的更多技巧

5.1使用前台服务

前台服务与普通服务(即后台服务)的两点主要的区别在于,

1)当系统出现内存不足的情况时,可能会回收后台服务,而不会回收前台服务。

2)后台服务是默默运行,看不到的。而前台服务会一直有一个正在运行的图标在系统的状态栏显示,下拉后可以看到详细信息,类似通知的效果。比如墨迹天气就是运用这一点。

技术分享

用法:在myService()的onCreate()方法中利用通知+startForeground()方法。

//具体code查书吧。

5.2使用IntentService

服务中的代码是默认运行在主线程中的,所以如果直接在服务中进行一些耗时的操作,就很容易出现ANR(Application Not Responding)情况。

处理方法一是,多线程+执行完毕后自动停止

 1 public class myService extends Service{
 2     @override
 3     public IBinder onBind(Intent intent){
 4         return null;
 5     }
 6     
 7     @override
 8     public int onStartCommand(Intent intent,int flags,int startId){
 9         new Thread( new Runnable(){
10             @override
11             public void run(){
12                 //处理具体的逻辑
13                 stopSelf();
14             }
15         }).start();
16         return super.onStartCommand(intent,flags,startId);
17     }
18 }

处理方法二是,不用考虑多线程和处理完毕后自动停止,IntentService类就自己实现了这两个功能。

 1 public class myIntentService extends IntentService{
 2     
 3     public myIntentService(){
 4         super("myIntentService");//调用父类的有参构造函数
 5     }
 6     
 7     @override
 8     protected void onHandleIntent(Intent intent){
 9         //处理具体的逻辑
10         //打印当前线程的id
11         Log.d("myIntentService","Thread id is " + Thread.currentThread().getId());//可以发现和主线程的线程id不太
12     }
13     
14     @override
15     public void onDestroy(){
16         super.onDestroy();
17         Log.d("myIntentService","onDestroy executed");//可以发现这个方法会自动执行,即使没有调用stopService()或stopSelf()方法。
18     }
19 }

 

6.服务的最佳实践-----后台执行的定时任务

 //code

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。