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
日常开发中,最好采用显示调用,代码的安全性更高 而且版本兼容性更好。