美文网首页
Service与Activity之间通信方式

Service与Activity之间通信方式

作者: 带带我 | 来源:发表于2021-02-24 15:20 被阅读0次

第一种方式:通过Binder方式调用Service方法

public class TestBinderService extends Service {

    private TestBinder mBinder;

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

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

    class TestBinder extends Binder{
        public void userService(boolean nice){
            Log.d("TAG", "userService: nice= "+nice);
            Toast.makeText(getApplicationContext(), "报告,任务完成", Toast.LENGTH_SHORT).show();
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d("TAG", "userService: onBind");
        if (mBinder == null){
            mBinder = new TestBinder();
        }
        return mBinder;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("TAG", "userService: onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
}

Activity如下

/* Activity实现了ServiceConnection 接口,Override了onServiceConnected与onServiceDisconnected方法,
我们可以在onServiceConnected方法中拿到binder,即可操作service,实现通信 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {

    private TestBinderService.TestBinder binder;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.tv_0).setOnClickListener(this);
        findViewById(R.id.tv_1).setOnClickListener(this);
        findViewById(R.id.tv_2).setOnClickListener(this);
        intent = new Intent(this, TestBinderService.class);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.tv_0){
            //绑定并启动服务
            bindService(intent, this, BIND_AUTO_CREATE);
            startService(intent);
        } else if (v.getId() == R.id.tv_1){
            //在onServiceConnected方法中 , binder被引用,可以调用service中自定义的binder的方法了
            binder.userService(true);
        } else if (v.getId() == R.id.tv_2){
            //若服务已经被停止或解绑,自然会报java.lang.IllegalArgumentException: Service not registered
            Intent intent = new Intent(this, TestBinderService.class);
            stopService(intent);
            unbindService(this);
        }
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d("TAG", "onServiceConnected: onServiceConnected");
        binder = (TestBinderService.TestBinder) service;
    }

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

第二种----广播
第三种----Eventbus

相关文章

网友评论

      本文标题:Service与Activity之间通信方式

      本文链接:https://www.haomeiwen.com/subject/belsfltx.html