在5.0上采用隐式启动时,会出现java.lang.IllegalArgumentException: Service Intent must be explicit异常。也就是说Service的Intent必须使用显示启动。
以下代码亲测,可用:
//创建启动Service的Intent,以及Intent属性
final Intent intent = new Intent();
intent.setPackage("com.example.zw.androidstudy1");
intent.setAction("com.example.zw.androidstudy1.service.TEST_SERVICE1");
startService(intent);
提供demo
TestService1:
public class TestService1 extends Service {
private final String TAG = "TestService1";
// 必须要实现的方法
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "===#onBind方法被调用!");
return null;
}
//Service被创建时调用
@Override
public void onCreate() {
Log.i(TAG, "===#onCreate方法被调用!");
super.onCreate();
}
//Service被启动时调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "===#onStartCommand方法被调用!");
return super.onStartCommand(intent, flags, startId);
}
//Service被关闭之前回调
@Override
public void onDestroy() {
Log.i(TAG, "===#onDestory方法被调用!");
super.onDestroy();
}
}
AndroidManifest.xml:
<!-- 配置Service组件,同时配置一个action -->
<service android:name=".TestService1">
<intent-filter>
<action android:name="com.example.zw.androidstudy1.service.TEST_SERVICE1"/>
</intent-filter>
</service>
MainActivity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.one_seven_layout);
start = (Button) findViewById(R.id.btnstart);
stop = (Button) findViewById(R.id.btnstop);
//创建启动Service的Intent,以及Intent属性
final Intent intent = new Intent();
intent.setPackage("com.example.zw.androidstudy1");
intent.setAction("com.example.zw.androidstudy1.service.TEST_SERVICE1");
//为两个按钮设置点击事件,分别是启动与停止service
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});
}