仍然无法绑定到我的Android服务

时间:2011-09-26 11:09:55

标签: android binding service android-intent data-transfer

我对Android很新,我正在将一个C#程序移植到android。大多数情况都很好,但我有一个长期存在的问题,即无法绑定到我的一个服务。 我想启动并绑定到服务以从服务接收sendBroadcast(intent)。意图包括使用sendBroadcast(intent)在UI中显示但返回nullpointer的数据包,可能是因为它未正确连接到活动。 我已经关注了很多不同的教程,包括这个网站上的建议,所有这些建议看起来都很合理并且据报道有效。 如 http://developer.android.com/reference/android/app/Service.html http://devblogs.net/2011/01/04/bind-service-broadcast-receiver/ http://www.androidcompetencycenter.com/2009/01/basics-of-android-part-iii-android-services/

错误似乎是服务无法正常启动...请参阅下面的堆栈跟踪: ActivityThread.handleCreateService(ActivityThread $ CreateServiceData)行:2943 服务为空。 onCreate或onStartCommand()不会在服务中被调用。

不幸的是我不能使用处理程序,因为没有从活动中调用Service类的构造函数。 正如你所看到的,我已经尝试了很多东西并做了一些认真的阅读,但显然我仍然缺少一些东西。 我将告诉你我正在尝试的代码版本,它产生了上面的堆栈跟踪。此代码不会超过oncreate()的活动!但来自bindservice()的bool tmp返回true ??

活动

        @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(D) Log.e(TAG, "+++ ON CREATE +++");

    // Various view initializations here

    Intent CuIntent = new Intent(this, Curve.class);
    CuIntent.setAction(".Core.CURVE_SERVICE");
    startService(CuIntent);
    Boolean tmp;
    tmp = bindService(CuIntent, CurveServiceConncetion, Context.BIND_AUTO_CREATE);


}

private ServiceConnection CurveServiceConncetion = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // TODO Auto-generated method stub

        CurveService = ((LocalBinder<Curve>) service).getService();

    }
    @Override
    public void onServiceDisconnected(ComponentName name) {

        // TODO Auto-generated method stub
        CurveService = null;
    }
};

活动清单带有服务的xml文件

        <application android:label="@string/app_name" android:icon="@drawable/pi_icon_t">
    <activity android:label="@string/app_name" android:name=".BTUI" android:finishOnCloseSystemDialogs="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"></action>
            <category android:name="android.intent.category.LAUNCHER"></category>
        </intent-filter>
        </activity>
    <service android:name=".Core.Curve" />
</application>

localBinder类(一个单独的类)来自另一个教程,是

    public class LocalBinder<S> extends Binder {
private String TAG = "LocalBinder";
private  WeakReference<S> mService;


public LocalBinder(S service){
    mService = new WeakReference<S>(service);
}


public S getService() {
    return mService.get();
}

}

服务看起来像这样

     public class Curve extends Service
{
    private IBinder mBinder = new LocalBinder<Curve>(this);

    @Override
    public void onCreate() {
        super.onCreate();
        String balls = "balls";
        Toast.makeText(this, "Curve Service created...", Toast.LENGTH_LONG).show();
    }


    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return mBinder;//
    }
    @Override
    public void onStart(Intent intent, int startId) {
         String balls = "balls";
            Toast.makeText(this, "Curve Service created...", Toast.LENGTH_LONG).show();

    }
    @Override
    public void onDestroy() {

       mBinder = null;
    }

这真的不是那么难,我希望有人能看到我出错的地方。

编辑我为这篇文章选了一个坏名字。绑定返回true但在离开活动的onCreate()后立即崩溃。错误文本位于上面的介绍中。

1 个答案:

答案 0 :(得分:0)

需要查看大量代码,但我有一个假设:

尝试删除:

CuIntent.setAction(".Core.CURVE_SERVICE");

此处的意图过滤器:

<service android:name=".Core.Curve">
<intent-filter>
    <action android:name=".Core.CURVE_SERVICE"></action>
</intent-filter>
</service>