Android Service和Activity通信

一,通过startService(Intent service)启动服务

只能通过广播实现通信


二,通过bindService(Intent service,ServiceConnection conn,int flags)启动服务


第一个参数如果只是调用setAction(String action)方法实现隐式的Intent调用Service会出现Implicit intents with startService are not safe错误,这是引文从Lollipop开始,service服务必须采用显示方式启动

Android源码

改进方法:

1) 直接在Intent中指定要启动的Service 

Intent intent = new Intent(xxx.this,xxx.class);

bindService(intent,ServiceConnection,flags);

2) 设置Action和PackageName

Intent intent = new Intent();

intent.setAction("xxx.xxx.xxx");

intent.setPackage(getPackageName());

bindService(intent,ServiceConnection,flags);


在调用bindService的Activity中实现定义ServiceConnection,并实现其中的方法


public void onServiceConnected(ComponentName name,IBinder service);//强转成自己实现的Binder对象,即可实现通信

public void onServiceDisconnected(ComponentName name);


在Service类中定义内部类实现Binder,在onBind回调方法中将Binder的实例返回。


实例:

public class MyService extends Service {

    private int count = 110;
    private String TAG = "Service";

    private MyBinder binder = new MyBinder();

    public class MyBinder extends Binder {
        public int getCount(){
            return count;
        }
    }

    public MyService() {

    }

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

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

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

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e(TAG,"onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG,"onBind");
        return binder;
    }
}


public class MainActivity extends Activity{

    private Button bind,unbind;

    private MyService.MyBinder binder;

    ServiceConnection connectionn = new ServiceConnection(){
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e(TAG,"onServiceConnected");
            binder = (MyService.MyBinder)service;
            Log.e(TAG,binder.getCount() + "");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e(TAG,"onServiceDisconnected is called");
        }
    };

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

        bind= (Button)findViewById(R.id.bind);
        bind.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
		Intent intent = new Intent(MainActivity.this,MyService.class);
            	bindService(intent, connectionn, Service.BIND_AUTO_CREATE);
}  
	});
unbind= (Button)findViewById(R.id.unbind); unbind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {
		unbindService(connectionn);
} }); }}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值