我对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()后立即崩溃。错误文本位于上面的介绍中。答案 0 :(得分:0)
需要查看大量代码,但我有一个假设:
尝试删除:
CuIntent.setAction(".Core.CURVE_SERVICE");
此处的意图过滤器:
<service android:name=".Core.Curve">
<intent-filter>
<action android:name=".Core.CURVE_SERVICE"></action>
</intent-filter>
</service>