Android 可以绑定到API 16(4.1.2)中的本地服务,但不能绑定到API 8(2.2)中的本地服务

Android 可以绑定到API 16(4.1.2)中的本地服务,但不能绑定到API 8(2.2)中的本地服务,android,binding,service,Android,Binding,Service,我正在开发一个从API 8到API 16的应用程序 在启动时,程序应该绑定到我的本地服务 在使用API 16设置的AVD上进行测试时,我没有遇到任何问题,包括服务绑定或其他任何问题 在设置为API 8的AVD上进行测试时,它根本不会绑定到我的本地服务 这是我的日志: 11-15 10:35:57.220: E/AndroidRuntime(326): FATAL EXCEPTION: main 11-15 10:35:57.220: E/AndroidRuntime(326): java.lan

我正在开发一个从API 8到API 16的应用程序

在启动时,程序应该绑定到我的本地服务

在使用API 16设置的AVD上进行测试时,我没有遇到任何问题,包括服务绑定或其他任何问题

在设置为API 8的AVD上进行测试时,它根本不会绑定到我的本地服务

这是我的日志:

11-15 10:35:57.220: E/AndroidRuntime(326): FATAL EXCEPTION: main
11-15 10:35:57.220: E/AndroidRuntime(326): java.lang.RuntimeException: Unable to start activity ComponentInfo{timesheetdb.Login/timesheetdb.Login.TimesheetConnect}: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=timesheetdb.Login/timesheetdb.Services.SocketService }
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.os.Looper.loop(Looper.java:123)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.ActivityThread.main(ActivityThread.java:4627)
11-15 10:35:57.220: E/AndroidRuntime(326):  at java.lang.reflect.Method.invokeNative(Native Method)
11-15 10:35:57.220: E/AndroidRuntime(326):  at java.lang.reflect.Method.invoke(Method.java:521)
11-15 10:35:57.220: E/AndroidRuntime(326):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-15 10:35:57.220: E/AndroidRuntime(326):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-15 10:35:57.220: E/AndroidRuntime(326):  at dalvik.system.NativeStart.main(Native Method)
11-15 10:35:57.220: E/AndroidRuntime(326): Caused by: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=timesheetdb.Login/timesheetdb.Services.SocketService }
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.ContextImpl.bindService(ContextImpl.java:874)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.content.ContextWrapper.bindService(ContextWrapper.java:347)
11-15 10:35:57.220: E/AndroidRuntime(326):  at timesheetdb.Login.TimesheetConnect.onStart(TimesheetConnect.java:47)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.Activity.performStart(Activity.java:3781)
11-15 10:35:57.220: E/AndroidRuntime(326):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
11-15 10:35:57.220: E/AndroidRuntime(326):  ... 11 more
我不明白的是,为什么会有SecurityException说我不允许绑定到服务。我可以在API 16中绑定到它,但在API 8中无法绑定。这不合逻辑

拜托,有人能帮忙吗

根据要求: 它不是整个代码,只是在活动开始时处理绑定的片段

private SocketService mainService;
private ServiceConnection serviceConn;
private boolean isServiceBound;

@Override
protected void onStart() {
    super.onStart();

    // First create ServiceConnection
    createServiceConnection();

    // Bind to SocketService
    Intent sInt = new Intent(this, SocketService.class);
    if ((isServiceBound = bindService(sInt, this.serviceConn,
            Context.BIND_AUTO_CREATE))) {
        Log.i("info", "Service has been bound.");
    }
}

@Override
protected void onStop() {
    super.onStop();

    if (isServiceBound) {
        unbindService(serviceConn);
        isServiceBound = false;
    }
}

@Override
protected void onDestroy(){
    super.onDestroy();

    if (isServiceBound) {
        unbindService(serviceConn);
        isServiceBound = false;
    }
}

private void createServiceConnection() {
    this.serviceConn = new ServiceConnection() {
        public void onServiceDisconnected(ComponentName name) {
            mainService = null;
            isServiceBound = false;
            Log.i("info", "Service disconnected.");
        }

        public void onServiceConnected(ComponentName name, IBinder service) {
            mainService = ((SocketService.SocketBinder) service)
                    .getService();
            isServiceBound = true;
            Log.i("info", "Service connected.");
        }
    };
}
服务的清单定义为:

  <service
        android:name="timesheetdb.Services.SocketService"
        android:exported="false"
        android:permission="normal" android:stopWithTask="true" android:enabled="true">
        <intent-filter>
            <action android:name="timesheetdb.Services.SocketService" />
        </intent-filter>
    </service>


尝试使用google api的用户仿真器(api 8的一部分)以下是服务定义的有效属性列表

http://developer.android.com/guide/topics/manifest/service-element.html
您可以尝试从清单中的服务定义中删除权限和stopWithTask属性


让我知道这是否有效

您可以发布用于绑定的代码以及服务的清单定义吗?根据您的请求,我已经发布了绑定代码和清单定义。这似乎起到了作用。谢谢,我很感激。权限属性在那里只是因为有一次我收到了警告。现在我不明白了。奇怪的