Android--服务

服务

一.基础知识

服务一般分为两种:

1:本地服务, Local Service 用于应用程序内部。

在Service可以调用Context.startService()启动,调用Context.stopService()结束。

在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。

调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。

多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可

android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个服务Service来播放音乐、记录你地理信息位置的改变、启动一个服务来运行并一直监听某种动作。

Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!

onCreate()   创建时候调用,初始化。只在第一次创建的时候执行。

onStartCommand()  启动时候调用,每次启动都会去执行。

onDestory()  销毁时候调用,一般回收那些不再使用的资源。

在XML文件里面注册。

startService()  开启服务

stopService()  停止服务

startService() 和 stopService()  方法都定义在Context类中的。所以我们在活动中可以调用这两个方法

这里完全是由活动来决定服务何时停止的(在按钮点击开始服务就开了,点击停止服务就停了)

服务自己停止自己的办法,在MyService()的任何一个位置调用stopSelf()方法就可以让这个服务停下来。

活动和服务之间的通信

虽然服务是在活动里面启动的,但是启动之后,服务就和活动没有关系了。

在活动中指挥服务去做什么,onBind()方法。

public class MyService extends Service {

    private DownloadBinder mBinder = new DownloadBinder();

    class DownloadBinder extends Binder{
        //开始下载
        public  void startDownload(){
            Log.d("MyService","startDownload executed");
        }
        //查看下载
        public int getprogress(){
            Log.d("MyService","getProgress executed");
            return 0;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}

创建一个专门的Binder对象来对下载功能进行管理。上面活动可以控制服务里面的逻辑。

1、创建了一个DownloadBinder类,继承自Binder,实现了两个模拟方法。

2、创建了DownloadBinder实例,然后在onBinder()方法里面返回这个实例,

绑定服务:活动绑定。,

取消绑定服务:

    private MyService.DownloadBinder downloadBinder;

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }
    };
  @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.start_service:
            Intent startIntent = new Intent(this, MyService.class);
            startService(startIntent);
            break;
        case R.id.stop_service:
            Intent stopIntent = new Intent(this, MyService.class);
            stopService(stopIntent);
            break;
        case R.id.bind_service:
            Intent bindIntent = new Intent(this, MyService.class);
            bindService(bindIntent, connection, BIND_AUTO_CREATE);
            break;
        case R.id.unbind_service:
            unbindService(connection);
            break;
        case R.id.start_intent_service:
            Log.d("MainActivity", "Thread id is " + Thread.currentThread().getId());
            Intent intentService = new Intent(this, MyIntentService.class);
            startService(intentService);
            break;
        default:
            break;
        }
    }

ServiceConnection的匿名类,重写了两个方法,这两个方法分别在活动与服务成功绑定解除绑定的时候调用。

那么如何绑定呢?

bindService(intent,ServiceConnection,标志位)

BIND_AUTO_CREATE 表示活动与服务进行绑定后自动创建服务。会使得onCreat()方法执行,但onStartCommand()方法不会执行。

MyService不仅可以和MainActivity绑定,还可以和任何一个其他的活动进行绑定。

服务的生命周期

            

当同时调用了startService()和bindService()之后,必须同时调用stopService()和unbindService()方法,onDestory()才会执行。

使用前台服务

前台服务和普通服务最大的区别在于,他会一直有一个正在运行的图标在系统的状态栏显示。

    @Override
    public void onCreate() {
        super.onCreate();
        Notification notification = new Notification(R.drawable.ic_launcher,"Notification comes", System.currentTimeMillis());
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,notificationIntent, 0);
        notification.setLatestEventInfo(this, "This is title", "This is content",pendingIntent);
        startForeground(1, notification);
        Log.d("MyService", "onCreate executed");
    }

创建通知。只不过这次创建出的Notification对象并没有使用NotificationManager来将通知显示出来,而是调用了startForeground()方法。

startForeground() 第一个参数是ID,类似于notify()方法的第一个参数,第二个参数则是构建出的Notifacation对象。

调用startForeground() 之后就会让MyService变成一个前台服务。并在系统状态栏显示出来。

使用IntentService

服务中的代码都是运行在主线程中的,如果直接在服务里去处理一些耗时操作,容易出现ANR情况。

所以这个时候就需要用到Android多线程编程的技术了,在服务中开启一个子线程。

记得开启一个线程,并且关闭这个线程,stopSelf()。

IntentService很好的解决了上面两个问题。

public class MyIntentService extends IntentService {

    /**
     * Creates an IntentService.  Invoked by your subclass‘s constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public MyIntentService(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

    }
}

必须要提供一个无参的构造函数,并且必须在其内部调用父类的有参构造函数。然后要在子类内去实现onHandlerIntent()这个抽象方法。在这个方法中可以处理一些具体的逻辑。而不用担心ANR的问题。因为这个方法已经在子线程里面执行了,这里为了证实一下,我们在onHandlerIntent()方法中打印了当前线程的ID,另外根据IntentService的特性,这个服务在运行结束后应该会是自动停止的。

时间: 2024-08-07 21:39:52

Android--服务的相关文章

android服务unbind之后再想绑定问题

突然遇到个问题, 问题描述: 我按照顺序来绑定一个服务:start->bind 最后在退出activity的时候unbind一下, 现在我有这样的业务需求,就是当我再次进入该activity时需要再次bind, 我发现再调用bind方法并不能绑定服务(不知道google工程师为啥要设计成这样.) 写了一段测试代码验证一下: Service: package org.load.testservice; import android.app.Service; import android.conte

erlang-百度云推送Android服务端功能实现-erlang

百度云推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push 简单的介绍下原理: 百度云推送支持IOS和Android的云推送.Android支持的还不错,但是IOS一般很难调通.百度云对于IOS的推送来说,他只是做了一个中间的代理,为用户提供接口,优点是使用百度云推送,Android和IOS可以统一管理:缺点是:调通不容易,用户的IOS证书需要上传验证,会直接暴露给第三方,并且IOS的apns支持用户自己构建p

android 服务与多线程

android服务是执行在UI主线程的.一下是代码demo: package com.example.testservice; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCr

Android 服务类Service 的详细学习

上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们可以在无形中使我们的软件和网络.数据库.系统等进行交互,之后通过UI(Notification就是一种展示方式)把结果展现在我们面前.可以说,他们是android生命体系里面的神经系统,通过反射条件让身体展现不同的状态.在整个系统中,广播接收器充当着是传输者和监听者的角色,它把系统的一点点变化都反馈上去,之后

Android服务Service总结

转自 http://blog.csdn.net/liuhe688/article/details/6874378 富貴必從勤苦得,男兒須讀五車書.唐.杜甫<柏學士茅屋> 作为程序员的我们,须知富贵是要通过勤苦努力才能得到的,要想在行业内有所建树,就必须刻苦学习和钻研. 今天我们来讲一下Android中Service的相关内容. Service在Android中和Activity是属于同一级别上的组件,我们可以将他们认为是两个好哥们,Activity仪表不凡,迷倒万千少女,经常做一些公众人物角色

Xamarin.Android服务的实现

一.服务的生命周期 服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法: 在真实的使用中,Service来还包含一个OnBind方法,并且必须要使用该方法,但是只要返回NULL即可,除非当前服务是一个绑定服务,那么就要返回实现了IBinder的实例. 二.回调方法的总结 上图中涉及到了几个方法,下面将做简单的介绍: OnCreate:只会在服务第一次开启的时候调用,主要负责一些初始化代码 OnStartCommand:每次启动服务都会调用该方法,可能来自

.Net程序员玩转Android开发---(18)Android服务

在做.NET开发的时候,我们经常会写windows service服务,在后台运行.在android系统中,同样可以写android服务. Service是安卓四大组件一个非常重要的组件, 四大组件包括Activity, Service ,BroadCastReceive,Content Provicer, 前几节课中,我们一直讲解activity,这节我们看下怎样使用Service, 我们在一些后台操作的时候,会使用service,比如在后台不断获取当前地理位置信息. 并且service服务还

Android服务之Service

Android服务之Service android中服务是运行在后台的东西,级别与activity差不多.既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西.你可以启动一个服务Service来播放音乐,或者记录你地理信息位置的改变,或者启动一个服务来运行并一直监听某种动作. Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的请求或者动作.你可以在服务中开一一个线程,在线程中做耗时动作. 那么究竟Service怎么使用呢? 老规矩,先来点基础知识. 一

android服务之录音功能

该服务的作用是当打电话时自动录音. 布局文件 布局文件中开启录音服务 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="m

Android 服务绑定与数据同步

1 package com.example.metrox.l15; 2 3 import android.content.ComponentName; 4 import android.content.Intent; 5 import android.content.ServiceConnection; 6 import android.os.IBinder; 7 import android.provider.Settings; 8 import android.support.v7.app.