Android中的Service

原创 2017年01月03日 15:35:17

Service

一、特点:

    Android四大组件之一
    没有UI,后台处理耗时操作或者执行长期运行任务
    会影响进程的优先级,从而影响内存进程被杀几率

二、与Thread区别
运行线程,service运行在UI线程,可以再起一个线程。
机制:Service作为远端全局工作,可以和任何Activity交互,Thread引用范围局限在Activity
优先级:Service会影响进程优先级,线程优先级跟进程无关。
生命周期:Service有生命周期方便管理。Thread无。
进程:Service可跨进程运行,Thread无。

三、Activity与Service交互

public class MainActivity extends Activity implements View.OnClickListener {
    private static final String TAG = ">>>MainActivity";

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Log.d(TAG, "receive message:" + msg.what);
        }
    };

    private ServiceConnection mSerCon = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
//            自定义Binder
//            TestService.MyBinder binder = (TestService.MyBinder) service;
//            service回调
//            binder.setCallback(new TestService.Callback() {
//                @Override
//                public void sendMessageToActivity(int what, int arg1, int arg2, Object object) {
//                    Log.d(TAG, "service sendMessageToActivity:" + what);
//                }
//            });
//            Activity调用Service
//            Log.d(TAG, "onServiceConnected, count:" + binder.count(2, 3));
            //使用Messenger,activity,service相互调用
            Messenger myMessenger = new Messenger(service);
            try {
                myMessenger.send(Message.obtain(mHandler, 1, mHandler));
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "onServiceDisConnected");
        }
    };

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

        findViewById(R.id.startService).setOnClickListener(this);
        findViewById(R.id.stopService).setOnClickListener(this);
        findViewById(R.id.bindService).setOnClickListener(this);
        findViewById(R.id.unbindService).setOnClickListener(this);
        findViewById(R.id.bindService2).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.startService:
                Intent intent = new Intent(this, TestService.class);
                intent.putExtra(TestService.INTENT_EXTRA.A, 8);
                startService(intent);

                intent.putExtra(TestService.INTENT_EXTRA.A, 9);
                startService(intent);
                break;
            case R.id.stopService:
                stopService(new Intent(this, TestService.class));
                break;
            case R.id.bindService:
                bindService(new Intent(this, TestService.class), mSerCon, BIND_AUTO_CREATE);//表示绑定的时候如果service不存在则自动创建
                break;
            case R.id.unbindService:
                unbindService(mSerCon);
                break;
            case R.id.bindService2:
                startActivity(new Intent(this, AnotherActivity.class));
                break;
        }
    }
}
public class TestService extends Service {
    private static final String TAG = ">>>TestService";

    public static final class INTENT_EXTRA {
        public static String A = "a";
    }

    private Callback mCallback;
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Handler clientHandler = (Handler) msg.obj;
            Log.d(TAG, "receiver message:" + msg.what + "," + msg.obj);
            //service回发消息
            clientHandler.sendEmptyMessage(2);
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "service onBind");
//        return new MyBinder();自定义binder
        return new Messenger(mHandler).getBinder();//使用Messenger,activity,service相互调用
    }

    @Override
    public boolean onUnbind(Intent intent) {
        boolean ret = super.onUnbind(intent);
        Log.d(TAG, "service onUnbind, return:" + ret);
        return ret;
    }

    @Override
    public void onRebind(Intent intent) {
        Log.d(TAG, "service onRebind");
        super.onRebind(intent);
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "service onCreate, looper:" + Looper.myLooper());
        super.onCreate();

//        mHandler.postDelayed(new Runnable() {
//            @Override
//            public void run() {
//                停止service
//                stopSelf();
//                  根据id暂停service
//                stopSelfResult()
//            }
//        }, 5000);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "service onStartCommand, looper:" + Looper.myLooper() + "," + intent);
        if (intent != null) {
            Log.d(TAG, "service arg:" + intent.getIntExtra(INTENT_EXTRA.A, 0));
        }
        if (mCallback != null) {
            mCallback.sendMessageToActivity(88, 0, 0, null);
        }
        return START_REDELIVER_INTENT;
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "service onDestory");
        super.onDestroy();
    }

    //Activity调用Binder方法
    class MyBinder extends Binder {
        public int count(int a, int b) {
            return a + b;
        }
        //设置回调方法
        public void setCallback(Callback callback) {
            mCallback = callback;
        }
    }

    interface Callback {
        void sendMessageToActivity(int what, int arg1, int arg2, Object object);
    }
}

四、Service生命周期

这里写图片描述

五、onStartCommand返回值
START_STICKT 如果service被系统杀掉,会稍后被重启,但不会重传intent
START_NOT_STICKY 如果service被系统杀掉则不会被重启
START_REDELIVER_INTENT如果service被系统杀掉,会稍后被重启,且会重传intent

六、IntentService

    //单线程队列化执行,执行完后自动结束
    class IntentTestService extends IntentService{

        public IntentTestService(String name) {
            super(name);

        }

        @Override
        protected void onHandleIntent(Intent intent) {
            //已经在一个线程里面了,可以做任何耗时操作
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

关于Android中Service的手动、自动以及其在特殊条件下的重启

基于Sevice的守护,我们可以做一些事。例如重启。看到重启你是不是就会想到Service自身来重启呢?很遗憾,Service不能在kill(ondestory)掉自己之后又重新onstart,所以我...
  • u013761665
  • u013761665
  • 2014年11月06日 22:00
  • 1826

Android Service最全面的解析

刘明渊 的博客地址:http://blog.csdn.net/vanpersie_9987 Service Service是Android中一个类,它是Android四大组件之一,使用S...
  • scott2017
  • scott2017
  • 2016年05月26日 11:41
  • 28135

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ...
  • xiaanming
  • xiaanming
  • 2013年08月05日 00:11
  • 186950

Android Service的启动过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操作是会...
  • qq_35114086
  • qq_35114086
  • 2016年10月15日 19:51
  • 489

【Android服务】制作无法销毁的Service

今天面试没表现好啊,现在来好好研究下这个问题:如何制作Android无法销毁的Service?(虽然在用户的角度上看,这样的开发显得很无赖) 事实上,解决这个还需要一个帮助,运用广播。 在启动Se...
  • u011669081
  • u011669081
  • 2016年01月24日 20:06
  • 1804

Android 服务类Service 的详细学习

上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道。它们可以在无形...
  • vipzjyno1
  • vipzjyno1
  • 2014年05月19日 08:07
  • 46180

关于Android Service真正的完全详解,你需要知道的一切

Service 1.Service基础知识概述   Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一...
  • javazejian
  • javazejian
  • 2016年10月07日 08:11
  • 44293

安卓service中上传文件

在service中写一个新线程用来上传文件,还没测试通不通。先把代码放上来~ public class WifiService extends Service { public static...
  • ulike_MFY
  • ulike_MFY
  • 2016年09月09日 08:34
  • 1222

Android开发四大组件之Service(详解篇)

Service是android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,区别是Se...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2014年07月21日 11:00
  • 5357

Android Service完全解析,关于服务你所需知道的一切(上)

相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了。Service作为Android四大组件之一,在每一个应用程序...
  • sinyu890807
  • sinyu890807
  • 2013年10月31日 08:10
  • 238746
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中的Service
举报原因:
原因补充:

(最多只允许输入30个字)