`
l540151663
  • 浏览: 181062 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

Android的Service总结

 
阅读更多
参考链接:http://www.cnblogs.com/lwbqqyumidi/p/4181185.html

  Android上经常会碰到Service,用到的都比较零散,今天比较全面的了解了下。

  Service也是组件之一,如需使用,需要在清单文件中注册。代码如下:
  <service
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:name="string"
    android:process="string" >
    . . .
  </service>
  上面是用到较多的几个属性,name为服务类,process为进程名。exported是否允许远程调用。

下面是简单的实现service类:
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;


public class MyService extends Service {

    public static final int MSG_SEND_TO_SERVER = 1;
    public static final int MSG_SEND_TO_CLIENT = 2;

    private Messenger mClientMessenger;
    private Messenger mServerMessenger = new Messenger(new ServerHandler());

    private static int mark =1;

    @Override
    public IBinder onBind(Intent intent) {
        return mServerMessenger.getBinder();
    }

    class ServerHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_SEND_TO_SERVER:
                    mClientMessenger = msg.replyTo;
                    Message toClientMsg = Message.obtain(null, MSG_SEND_TO_CLIENT);
                    toClientMsg.obj = "来自Service:" + mark;
                    try {
                        mClientMessenger.send(toClientMsg);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    mark++;
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        Log.e("123","onDestroy");
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
}

Activity调用service简单代码如下:
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView tvRecord;
    private Button btnBindService;
    private Button btnStartService;
    private Button btnSend;
    private Button btnUnBindService;
    private Button btnStopService;

    private ServiceConnection sc = new MyServiceConnnect();
    private boolean isConnnect =false;


    private Messenger mServerMessenger;
    private Handler mClientHandler = new MyClientHandler();
    private Messenger mClientMessenger = new Messenger(mClientHandler);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();
        setListener();
    }

    private void setListener(){
        btnBindService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                bindService(intent, sc, Context.BIND_AUTO_CREATE);
            }
        });
        btnStartService.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                startService(intent);
            }
        });
        btnSend.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                send();
            }
        });
        btnStopService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                stopService(intent);
            }
        });
        btnUnBindService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isConnnect) {
                    unbindService(sc);
                    isConnnect = false;
                }
            }
        });
    }

    private void send(){
        if (!isConnnect){
            return;
        }
        Message msg = Message.obtain(null, MyService.MSG_SEND_TO_SERVER);
        msg.replyTo = mClientMessenger;
        try {
            mServerMessenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    private void findView(){
        tvRecord = (TextView)findViewById(R.id.tv_record);
        btnBindService = (Button) findViewById(R.id.btn_bind);
        btnStartService = (Button)findViewById(R.id.btn_start);
        btnSend = (Button)findViewById(R.id.btn_send);
        btnStopService = (Button)findViewById(R.id.btn_stop);
        btnUnBindService = (Button)findViewById(R.id.btn_unbind);
    }

    class MyClientHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MyService.MSG_SEND_TO_CLIENT) {
                String obj = (String)msg.obj;
                tvRecord.setText(obj);
            }
        }
    }

    class MyServiceConnnect implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mServerMessenger = new Messenger(service);
            isConnnect =true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isConnnect =false;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}


  一般启动服务有两方法:startService和bindService。
  startService比较简单,通过stopService结束。当服务已经启动,则不会调用oncreate方法,直接调用onStartCommand。startCommand的返回值意义如下:
START_NOT_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,即使系统内存足够可用,系统也不会尝试重新创建此Service。除非程序中Client明确再次调用startService(...)启动此Service。

START_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,当系统内存足够可用的情况下,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand(...)方法,但其中的Intent将是null,pendingintent除外。

START_REDELIVER_INTENT:与START_STICKY唯一不同的是,回调onStartCommand(...)方法时,其中的Intent将是非空,将是最后一次调用startService(...)中的intent。

START_STICKY_COMPATIBILITY:compatibility version of {@link #START_STICKY} that does not guarantee that {@link #onStartCommand} will be called again after being killed。此值一般不会使用,所以注意前面三种情形就好。

  bindService也可启动服务,可通过unbindService结束,此方法可通过接口,通过信使通信。具体代码如上。如通过bindservice启动的服务,需关闭所有的依赖才可结束服务。
分享到:
评论

相关推荐

    android service总结文档

    一篇对于android service的详细总结

    Android Service总结及详细介绍

    本文主要介绍Android Service的知识,这里整理了详细资料及简单实现示例代码,有需要的小伙伴可以参考下

    Android Service大总结Demo

    Android Service大总结Demo 包括跨进程之间的通信。详情请参考博客

    Android实现双进程守护,如何保证Service不被Kill

    Android实现双进程守护,如何保证Service不被Kill,onStartCommand方法,返回START_STICKY,手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,比较不错,但是不能保证...

    Android之Service学习总结收集.pdf

    Android之Service学习总结收集.pdf

    Android Intent Service BroadCast AndroidStudio

    本项目将Android中的Intent总结了一遍。主要有四个项目,Intent_Intent项目是简单的Intent跳转(setActivityResult);Intent_broadcast主要是静态广播的注册;Intent_broadcastdynamic主要介绍动态广播的注册;...

    Android开发四大组件之Service应用总结Demo

    service的启动,停止,绑定,取消绑定,以及IntentService的生命周期走向测试和IntentService与访问者信息通信过程,不清楚之处请参阅我的博客《Android开发四大组件之Service总结》

    android_Service通信总结

    这是一个关于Service与Activity通信的部分代码,及如何使用Service和Activity通信。

    Android Service服务详细介绍及使用总结

    主要介绍了Android Service 服务的详细资料,网上关于Android Service 服务的文章比较多,但是不是很全面,不够细致,毕竟是Android 四大组件之一,重要性不用说,这里总结下,需要的朋友可以参考下

    Android BLE开发总结

    AndroiBLE开发总结: 在Android BLE开发中,设备、服务、特征和描述它们之间的关系如下: - 设备(Device):指BLE设备,如蓝牙耳机、传感器等。 - 服务(Service):指BLE设备所提供的服务,一个BLE设备可以提供多...

    Android 5.0以上Toast不显示的解决方法

    最近在开发中我们经常会在适配5.0以后的机型遇到各种各样的问题,其中有一个不大不小的问题就是:Toast不显示问题,这篇文章就给大家总结了Android 5.0以上Toast不显示的原因与解决方法,有需要的朋友们可以参考借鉴...

    Android中Service的全面总结

    全面总结Android Service的使用方法,具体内容如下 1、Service的种类 按运行地点分类: 其实remote服务还是很少见的,并且一般都是系统服务。 按运行类型分类: 有同学可能会问,后台服务我们可以自己创建 ...

    android ams

    关于android activityManagerService的总结

    android知识大总结【邯院】

    16. android客户端调用web service 63 Android开发讲课流程.doc; Android简介 3 第一章 搭建Android开发环境 4 第二章 Android工程目录介绍 9 第三章 电话拨号器和发送短信小程序 12 第四章 日志输出和单元测试 17...

    Android实训实习报告总结.docx

    巩固和学习了更多的Android的控件、布局、Activity、Service等一系列基础知识,对整个Android的开发有了大致的了解。android入门后,只会照着别人的葫芦来画瓢,即没有设计思想,也没有自主原创的代码,不好不好 ...

    Android开发案例驱动教程 配套代码

    采用案例驱动模式展开讲解知识点,即介绍案例-&gt;案例涉及技术-&gt;展开知识点-&gt;总结的方式 本书作者从事多年一线开发和培训,讲解知识点力求细致,深入浅出 目 录 前言 第1章 Android操作系统概述 1 1.1 Android...

    android 驱动,HAL层framework层到应用层的总结

    这篇总结是通过学习android源码情景分析得来的,是学习第二章HAL层的心得笔记,我学的比较浅,自己总结的知识,从硬件驱动到硬件抽象层到硬件服务到应用等的介绍

    我的总结--Android之ANR的原理(Input, Service, Broadcast)

    关于ANR原理的透彻总结,简单易懂

    Android代码-安卓开发学习资料和对应Demo

    安卓开发学习的各种资料以及对应的demo 开源客户端学习研究 准备通过这个客户端深入学习。...深入理解Android的startservice和bindservice Android Studio权威教程专栏 各种源码解析分析 值得阅读的android技术文章

Global site tag (gtag.js) - Google Analytics