zoukankan      html  css  js  c++  java
  • 大四实习准备6_android服务

    2015-5-9

    1.服务是什么

    android四大组件之一,有一些特点:

    1)服务的运行不依赖于用户界面,即使程序被切换到后台、或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。(当对应的程序关闭了呢?)

    2)服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当该进程被杀掉时,所有依赖于该进程的服务也会停止运行。

    3)服务并没有自动开启一个线程,其代码是默认运行在主线程中的。也即,我们需要在服务的内部手动创建子线程,并在当中执行具体的任务。以免出现主线程被阻塞的情况。(IntentService除外)

    2.Android多线程编程

    2.1线程的基本用法

    2.2利用异步消息处理机制在子线程中更新UI(不可以直接在子线程中跟新UI,只能在主线程中更新UI,否则会出现异常)

    2.3解析异步消息处理机制

    2.4使用AsyncTask

    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.服务的最佳实践-----后台执行的定时任务(即每隔一段时间就启动一次该服务,从而可以每隔一段时间就执行一次该服务的onStartCommand()方法。)

     //code

  • 相关阅读:
    已知: 每个飞机只有一个油箱, 飞机之间可以相互加油(注意是相互,没有加油机) 一箱油可供一架飞机绕地球飞半圈,问题:为使至少一架飞机绕地球一圈回到起飞时的飞机
    简易vector的实现
    简单的内存池实现
    归并排序,递归与非递归
    堆排序
    位运算
    二叉树的建立,以及非递归遍历
    “云端融合”思想的自我摸索(很不靠谱)
    linux android开发环境搭建
    Android系统架构及内核简介
  • 原文地址:https://www.cnblogs.com/kiwi-bird/p/4491169.html
Copyright © 2011-2022 走看看