2011-09-26 59 views
0

我对Android很新,我正在将一个C#程序移植到android。大部分情况都不错,但我有一个长时间运行的问题,无法绑定到我的一项服务。 我想要启动并绑定到服务以从服务接收sendBroadcast(intent)。意图包括使用sendBroadcast(intent)在UI中显示的数据包,但返回一个空指针,可能是因为它没有正确连接到活动。 我已经遵循了很多不同的教程,包括本网站上的建议,所有这些建议看起来都很合理,并且据报道是有效的。 如 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/仍然无法绑定到我的Android服务

的错误似乎是,该服务没有启动正常......看到以下堆栈跟踪: ActivityThread.handleCreateService(ActivityThread $ CreateServiceData)行:2943 服务为空。 onCreate或onStartCommand()不会在服务中调用。

不幸的是,我不能使用处理程序,因为Service类的构造函数不是从活动调用的。 正如你所看到的,我已经尝试了很多东西,并做了一些认真的阅读,但显然我仍然错过了一些东西。 我会给你什么版本的代码,我目前正在尝试产生上面的堆栈跟踪。这段代码并不会通过create()!上的活动建立起来!但从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; 
    } 
}; 

与服务

 <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类(一个单独的类)活动清单XML文件是从另一个教程取出并是

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,但在离开activity的onCreate()后立即崩溃。错误文本在上面的介绍中。

回答

0

很多代码看低谷,但我有一个假设:

尝试删除:

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

,从这里的意图过滤器:

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

Knickedi您好,感谢对于你的建议,但杜尔加的答案是一样的,我试过这个:( – user960914

+0

Woops按钮,我已经尝试了很多东西,似乎我的服务没有启动CurveService为空,C由于我在所有地方都停止了分数,所以永远不会输入班级。 – user960914

+0

再次错误的按钮,绑定返回true,如果我使用如下所示的xml代码,但仍然CurveService为空,我的broadcastreceiver引发空指针 – user960914