Android Service基础

##Service

  • 普通的Service
  • 绑定的Service

初级程序员面试的必考题,两种生命周期都需要答出来

1、Service生命周期

####通用

  • onCreate:第一次被创建后立即回调该方法
  • onDestroy:service被关闭时回调该方法
    ####普通的Service
  • onStartCommon:每次调用startService方法,就会回调该方法

####绑定的Service

  • onBind:Service子类必须实现的方法,返回值是一个IBind对象,应用程序通过该对象与Service主键通信
  • onUnbind:解绑时会回调该方法

注:Service默认运行在主线程,如果要执行一些耗时操作,那么需要开辟一个新的线程或者使用IntentService,

###2、启动与关闭Service
#####启动方式:

  • 通过Context的startService方法:访问者与service之间没有关联,即使访问者退出了,service也在运行,启动的service所在进程属于服务进程
  • Context的bindService方法,使用该方法启动service,访问者(如Activity)与service绑定在一起,访问者一旦退出,service也就终止了,启动的service所在进行不属于服务进程

#####关闭方式

  • 普通的service:自己调用stopSelf 或者 Context的stopService
  • 绑定的service:context调用unbindService即可解除绑定,并且销毁service

###3、混合服务

#####操作步骤:

  • startService 为了让服务所在进程变成一个服务进程 service中会回调onCreate和onStartCommand方法
  • bindService 这样就可以调用service中的方法,与service进行通信 , 只会调用onBind方法
  • unbindService 解除绑定,在service中只会调用onUnbind方法
  • stopService service中只会回调onDestroy方法

#####作用场所,如

  • 后台播放音乐,前台点击开始或暂停,这样就可以调用service中相应的方法去开始或暂停音乐,1、先调用startService开启服务;2、紧接着调用bindService绑定服务,3、在activity被销毁的时候解绑服务。这样后台就可以一直播放音乐了。
  • 后台下载,步骤同上

#####案例代码

#####BindService.java

package cn.bmob.imdemo.servicedemo;

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

/**
 * Created by Administrator on 2016-06-05.
 * Author jiangxiaochang
 */
public class BindService extends Service {

    private static final String TAG = "BindService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "-----BindService--->>>>onCreate:准备播放音乐");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "-----BindService--->>>>onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "-----BindService--->>>>onBind");
        return new MyBinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG, "-----BindService--->>>>onUnbind");
        return true;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "-----BindService--->>>>onDestroy");
    }

    public class MyBinder extends Binder implements IMedia {

        @Override
        public void start() {
            startMusic();
        }

        @Override
        public void stop() {
            stopMusic();
        }
    }

    public void startMusic() {
        Log.i(TAG, "------>>>开始播放音乐");
    }

    public void stopMusic() {
        Log.i(TAG, "------>>>暂停播放音乐");
    }

    public interface IMedia {
        public void start();

        public void stop();
    }
}

#####MainActivity.java

package cn.bmob.imdemo.servicedemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;


public class MainActivity extends Activity {

    //实例化接口,为了只使用start和stop方法,限制调用其他方法
    BindService.IMedia iMedia;
    private String TAG = "MainActivity";

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i(TAG, "------>>>conn");
            iMedia = (BindService.MyBinder) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i(TAG, "------>>>disConn");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, BindService.class);
        //启动Service,让服务所在进程变成服务进程
        startService(intent);
        //绑定Service,为了与Activity等访问者进行通信
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    public void startClick(View view) {
        //音乐开始
        iMedia.start();
    }

    public void stopClick(View view) {
        //音乐暂停
        iMedia.stop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "----->>>>onDestroy");
        //在Activity(访问者)被销毁的时候解除绑定
        unbindService(conn);
    }
}

###4、IntentService
InteentService的特征:
1、会创建单独的子线程来处理所有的Intent请求及 onHandleIntent方法中的代码
2、当所有请求处理完成后,IntentService会自动停止,因此无需手动停止它
3、为Service的onBind方法提供默认实现,默认返回null
4、为Service的onStartCommand提供了默认实现,该实现会将请求Intent添加到队列中。

###5、AIDL(Android Interface Defication Language)
#####支付案例步骤如下

  • 创建一个支付型软件 A
  • A中创建一个service,并在AndroidManifest中注册,并设定Action(访问者需要通过这个Action隐式的绑定service)
  • 在A中创建一个AIDL,编写访问者可以被调用的方法(pay方法),再Rebuild一下,那么在路径(…\项目名称\app\build\generated\source\aidl\debug\cn\bmob\imdemo\aidl_pay\PayAIDL.java)中出现一个java文件。
  • 用service中自定义的类MyBind继承PayAIDL.java中的Stub类
  • 在MyBind中实现Stub类中的访问者可以访问的抽象方法(pay方法),在这个pay方法中处理业务逻辑
  • 创建一个测试型软件 B
  • B中通过A的service的Action,隐式的绑定这个service
  • 连接成功时通过PayAIDL payAIDL = PayAIDL.Stub.asInterface(service);实例化对象
  • 在点击支付按钮时,调用A中service的支付功能
    #####代码如下
    首先是A软件的AndroidManiFest中:
        <service android:name=".PayService">
            <intent-filter>
                <action android:name="cn.jxc.pay" />
            </intent-filter>
        </service>

A软件的Service

public class PayService extends Service {

    @Override
    public IBinder onBind(Intent intent) {

        return new MyBind();
    }

    class MyBind extends PayAIDL.Stub {

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public void pay() throws RemoteException {
            payMoney();
        }
    }

    public void payMoney() {
        Log.i("PayService", "--------->>>>打开支付界面");
    }
}

B软件的MainActivity


public class MainActivity extends Activity {


    private PayAIDL payAIDL;

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

        Intent intent = new Intent();
        intent.setAction("cn.jxc.pay");
        bindService(intent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                //这里应当这样实例化对象
                payAIDL = PayAIDL.Stub.asInterface(service);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        }, BIND_AUTO_CREATE);
    }

    public void startClick(View view) {
        try {
            //调用支付方法
            payAIDL.pay();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值