Android 学习之路 四大组件之service

1 进程概念介绍

  四大组件都是运行在主线程

  Android中的服务 也是在后台运行  可以理解成是在后台运行并且是没有界面的Activity

  (1)Foreground process 前台进程  用户正在交互  可以理解成相 当于 Activity执行onResume方法

  (2)Visible process 可视进程 用户没有在交互 但用户还一直能看得见页面 相当于Activity执行了onPause方法 

  (3)Service Process  服务进程  通过startService()开启了一个服务

  (4)Background process  后台进程  当前用户看不见页面 相当于Activity执行了onStop方法

  (5)Empty process 空进程 不回维持任何组件(用户一直按返回键 任务栈销毁,但进程还在)

2 start方式开启服务的特点

服务的生命周期

oncreate()

onstartCommand()

ondestory()

  服务是在后台运行 可以理解成是没有界面的activity

  定义四大组件的方式都是一样的  

  定义一个类继承Service

   特点:

  (1)服务通过startservice方式开启 第一次点击按钮开启服务 会执行服务的onCreate 和 onStart方法

  (2)如果第二次开始在点击按钮开启服务 服务之后执行onStrat方法

  (3)服务被开启后 会在设置页面里面的 running里面找得到这个服务 

  (4)startservice 方式开启服务 服务就会在后台长期运行 直到用户手工停止 或者调用StopService方法 服务才会被销毁

3.bindService

为了调用服务中的方法引入bindservice

(1)服务通过bindService方式开启 第一次点击按钮开启服务 会执行服务的onCreate 和 onBind方法

  (2)如果第二次在点击按钮开启服务 服务无响应

  (3)当onbind方法返回的值为null时,onserviceConnected方法不执行的

  (4)不求同日生 但求同日死  activity和服务之间

 (5)服务不可以多次解绑,多次解绑会异常

(6)通过bindService开启的服务在设置页面的正在运行中无法找到 相当于一个隐形服务

4.百度音乐盒小案例 (不实现具体功能只练习bindservice 混合开启服务)

业务需求:该服务既要持续在后台运行 也要调用服务中的方法

1.先调用startService开启服务

2.调用bindService绑定服务 传递方法

3.unBindService解绑服务

public class MainActivity extends AppCompatActivity {
    private UseMusic um;
    private MainActivity.myConn myConn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //混合开启服务
        //1.先start开启服务
        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
        //2.用bind开启服务 可以传递ibinder 从而可以调用方法
        myConn = new myConn();
        bindService(intent,myConn,BIND_AUTO_CREATE);

    }
    public class myConn implements ServiceConnection{




        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
             um = (UseMusic) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }
    public void play(View v){
        um.callPlay();

    }
    public void pause(View v){
       um.callPause();

    }
    public void continuePlay(View v){
        um.callRePlay();

    }


    @Override
    protected void onDestroy() {
        //解绑
        unbindService(myConn);
        super.onDestroy();
    }

}
public class MusicService extends Service {
    //一定要记得在onbind方法中把mybinder传递过去
    @Override
    public IBinder onBind(Intent intent) {
        return new myBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

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

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    public void play(){
        System.out.println("播放");
    }
    public void pause(){
        System.out.println("暂停");
    }
    public void replay(){
        System.out.println("继续播放");
    }
//定义一个Ibinder类的实现类(中间人对象 可以在外面的类中调用服务中的方法)继承一个接口的实现子类
    public class myBinder extends Binder implements UseMusic{


    @Override
    public void callPlay() {
        play();

    }

    @Override
    public void callPause() {
        pause();
    }

    @Override
    public void callRePlay() {
        replay();
    }
}
}
//在接口中暴漏想要暴露的方法
public interface UseMusic {
    public void callPlay();
    public void callPause();
    public void callRePlay();
}

aidl进程间的通信

猜你喜欢

转载自blog.csdn.net/duwei2545/article/details/85119735