Android—开发自学历程(2)-Service

Service

  • java.lang.Object
    • android.content.Context
      • android.content.ContextWrapper
        • android.app.Service

2.1 Service简介

Service是一种与Activity级别差不地的组件,同样属于Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider);Service是一种不能自己运行的只能后台运行,而且Service不能直接跟用户交互,但是Service可以跟其他组件进行交互,比如启动后的播放器,后台记录地理信息等,总之Service都是在后台服务。


2.2 Service启动方式

服务的启动方式:

  • 1)context.startService()
  • 2 )context.bindService()

服务的启动流程:

1)context.startService()->onCreate()->onStart()->Service running->context.stopService()->onDestroy()->Service stop

开启服务首先调用onCreate(),然后调用onStart() 运行服务。开发人员通过调用stopService()停止服务,假如开发人员没用调用stopService()而退出程序,则服务会在后台继续运行,但我们再次打开程序时会调用onStart(),而并不会调用onCreate(),也就是说onStart()可多次调用。这时我们调用stopService()才能停止服务。
所以调用startService的生命周期为:onCreate –> onStart (可多次调用) –> onDestroy


2)context.bindService() -> onCreate() -> onBind() -> Service running -> onUnbind() -> onDestroy() -> Service stop

onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。


2.3 Service生命周期

Service的生命周期比起Activity简单很多,因为Service就继承了onCreate()、onStart()、onDestroy()三个方法。
但我们启动服务是我们会调用onCreate()、onStart()。停止服务时调用onDestroy();这样一个服务就结束了。


2.4 Service实际例子

startService方式:
Service代码

package com.maple.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

public class MainService extends Service {

    private static final String TAG = "com.maple.servicedemo.mainservice";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "服务停止成功!");
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Log.d(TAG, "onStart");
        if(intent != null) {
            Bundle bundle = intent.getExtras();
            if(bundle != null){
                int op = bundle.getInt("op");
                switch (op) {
                case 1:
                    Log.d(TAG, "服务启动成功!");
                    break;
                default:
                    break;
                }
            }
        }
    }
}

Activity代码:

package com.maple.servicedemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    private static final String TAG = "com.maple.servicedemo";

    private Button mButton = null;
    private Button mButtonStop = null;

    private int op = -1;
    private Intent intent = new Intent("com.maple.servicedemo.MainService");

    private void startServices(int op) {
        Bundle bundle = new Bundle();
        bundle.putInt("op", op);
        intent.putExtras(bundle);
        startService(intent);
    }

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

        mButton = (Button) findViewById(R.id.start_service);
        mButtonStop = (Button) findViewById(R.id.stop_service);
        mButton.setOnClickListener(new myButtonListener());
        mButtonStop.setOnClickListener(new myButtonListener());
    }

//  @Override
//  protected void onDestroy() {
//      super.onDestroy();
//      
//      if(intent != null) {
//          stopService(intent);
//      }
//  }

    private class myButtonListener implements OnClickListener {
        @Override
        public void onClick(View v) {
            if(v.getId() == R.id.start_service) {
                startServices(1);
            }else if (v.getId() == R.id.stop_service) {
                stopService(intent);
            }
        }       


    }
}

bindService方式:
Service代码:


    private static final String TAG = "com.maple.servicedemo.mainservice";
    private final IBinder binder = new MyBinder();
    //此方法是为了可以在Acitity中获得服务的实例 
    public class MyBinder extends Binder {
        MainService getService() {
            return MainService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind");
        return binder;
    }
    @Override
    public void onCreate() {
         super.onCreate();
         Log.d(TAG, "启动服务");
         Toast.makeText(this, "启动服务", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "服务停止");
        Toast.makeText(this, "服务停止", Toast.LENGTH_SHORT);
    }

Activity代码:

package com.maple.servicedemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    private static final String TAG = "com.maple.servicedemo";

    private Button mButton = null;
    private Button mButtonStop = null;
    private MainService mService = null;
    private void bindServices() {
        //进入Activity开始服务 
        Intent intent = new Intent(MainActivity.this, MainService.class);
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }
    private ServiceConnection conn = new ServiceConnection() {
        //无法获取到服务对象时的操作 
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }
        //获取服务对象时的操作 
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = ((MainService.MyBinder) service).getService();
        }
    };  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindServices();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出服务
        this.unbindService(conn);
    }
}

记得要在AndroidManifest.xml注册下

        <service 
            android:enabled="true" 
            android:name=".MainService">
            <intent-filter>
                    <action android:name="com.maple.servicedemo.MainService" />

            </intent-filter>
        </service>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值