Android中BindService绑定多个Activity

BindService

关于BindService的介绍有很多,这里就不赘述了。
主要了解BindService的生命周期在这里插入图片描述

1. BindService绑定多个Activity

我们知道BindService可以绑定多个组件,而只有当绑定在服务上的组件都调用unbindService解除绑定服务或者组件本身就已经被系统回收,那么服务也就会被停止回收了,才会回调onUnbind()和 onDestroy() 方法。
而当BindService绑定多个Activity时,能否成功回调 onUnbind()和 onDestroy()方法,与Activity的启动模式有着密切联系。
对于Activity启动模式不了解的可以查阅相关资料

Activity有四种自动模式,默认的模式为“standard",而在这种情况下,基本是没办法成功回调 onUnbind()和 onDestroy()方法,因为当我们在不同Activity间跳转的时候,在任务栈中会创建多个Activity实例,而这些实例与你最初绑定的实例已经不同了,现在通过采用”singleInstance"启动模式来介绍

2.代码

BindService绑定3个Activity

MyService.java

package com.example.a02bindservice;

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

public class MyService extends Service {
    class MyBinder extends Binder {
        //创建服务的代理,调用服务中的方法 
        public void methodInBinder() {
            Log.i("lim", "执行MyBinder中的methodInBinder()方法");
            method();
        }
    }

    public void method() {
        Log.i("lim", "执行MyService中的method()方法");
    }

    @Override
    public void onCreate() {
        Log.i("lim", "创建服务,执行onCreate()方法");
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("lim", "绑定服务,执行onBind()方法");
        return new MyBinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("lim", "解绑服务,执行onUnbind()方法");
        return super.onUnbind(intent);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("lim", "call onStartCommand...");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.i("lim", "call onDestroy...");
    }
}

Activity1

package com.example.a02bindservice;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
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 AppCompatActivity {

    private MyConn myconn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("lim", "Activity1 OnCreate 任务栈号为"+ this.getTaskId());
    }

    public void activity1Click(View v){
        Intent intent = new Intent(this, Main2Activity.class);
        startActivity(intent);
        Log.v("lim", "跳转到Activity2");
    };

    public void bindClick(View v) {
        Log.i("lim", "bindClick()");
        if (myconn == null) {
            myconn = new MyConn(); //创建连接服务的对象 
        } else {
            Log.i("lim", "Activity1已绑定");
        }
        Intent intent = new Intent(MainActivity.this, MyService.class);
        bindService(intent, myconn, BIND_AUTO_CREATE);//绑定服务
    }

    public void callClick(View v) {
        Log.i("lim", "callClick()");
        if (myconn != null) {
            myconn.myBinder.methodInBinder(); //调用服务中的方法
        }
    }

    public void unbindClick(View v) {
        Log.i("lim", "unbindClick()");
        if (myconn != null) {
            unbindService(myconn); //解绑服务
            myconn = null;
        }else{ Log.i("lim", "Activity1无绑定");}
    }

    private class MyConn implements ServiceConnection {
        //创建MyConn类,用于实现连接服务
        // 当成功绑定服务时调用的方法,该方法获取MyService中的Ibinder对象
        private MyService.MyBinder myBinder;
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            myBinder = (MyService.MyBinder) iBinder;
            Log.i("lim", "Activity1服务成功绑定, 内存地址为:" + myBinder.toString());
        }

        //当服务失去连接时调用的方法
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.i("lim", "Activity1服务成功解绑");
        }
    }

Activity2 、Activity3与Activity1代码一致

Manifest
在这里插入图片描述

结果

一次 依次解绑后成功回调 onUnbind()和 onDestroy()方法

全部源码地址:https://github.com/lim7t/Android/tree/master/app

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android,可以通过调用`bindService()`方法来绑定一个Service。下面是多个Activity与一个Service进行绑定的代码示例: 1. 在Service定义一个Binder对象 ```java public class MyService extends Service { private final IBinder mBinder = new MyBinder(); public class MyBinder extends Binder { MyService getService() { return MyService.this; } } @Override public IBinder onBind(Intent intent) { return mBinder; } // Service的其他代码 } ``` 2. 在Activity绑定Service ```java public class MyActivity extends Activity { private MyService mService; private boolean mBound = false; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { MyService.MyBinder binder = (MyService.MyBinder) service; mService = binder.getService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; @Override protected void onStart() { super.onStart(); Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); if (mBound) { unbindService(mConnection); mBound = false; } } // Activity的其他代码 } ``` 在上面的代码,我们首先创建了一个ServiceConnection对象,它实现了onServiceConnected()和onServiceDisconnected()方法,这两个方法会在Service连接成功和断开连接时被调用。然后在onStart()方法调用bindService()方法来绑定Service,并传入ServiceConnection对象和一个标志位。在onStop()方法调用unbindService()方法来解除绑定。 需要注意的是,如果多个Activity都要绑定同一个Service,那么必须保证它们都使用同一个ServiceConnection对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值