显式调用与隐式调用

Android 开发中,对于组件(Activity,Service)的调用有两种方式:显示调用和隐式调用,我们通过一个例子,展示一下二者的差异。
新建一个项目,里面包含TestActivity.java和WinService.java两个类,

public class MainActivity extends AppCompatActivity {

    private ServiceConnection mConn = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service)
        {
            //绑定服务
        }

        @Override
        public void onServiceDisconnected(ComponentName name)
        {
            //解绑服务
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //开始绑定服务
        bindServiceInvoked();
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        unbindService(mConn);
    }

}

1. 显示调用:

private void bindServiceInvoked() {
     final Intent intent = new Intent(this, WinService.class);
     bindService(intent, mConn, Context.BIND_AUTO_CREATE);
     Log.e(TAG, "bindService invoked !");
}

在AndroidManifest.xml中,service 如下定义:

<service
    android:name=".WinService"
    android:enabled="true">
</service>

2. 隐式调用

首先,在AndroidManifest.xml中,service 定义是:

<service
    android:name=".WinService"
    android:enabled="true">
    <intent-filter>
       <action android:name="com.win.test"></action>
       <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
</service>

绑定服务的实现逻辑如下:

private void bindServiceInvoked() {
   final Intent intent = new Intent("com.win.test");
   bindService(intent, mConn, Context.BIND_AUTO_CREATE);
   Log.e(TAG, "bindService invoked !");
}

在Android5.0以后,google出于安全的考虑,规定service的intent一定要显性声明,所以隐式调用在Android5.0及之后的版本,编译时会报错:

IllegalArgumentException: Service Intent must be explicit:intent

日常开发中,最好采用显示调用,代码的安全性更高 而且版本兼容性更好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值