【发布时间】:2011-09-26 11:09:55
【问题描述】:
我对 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/
错误似乎是服务未正确启动...请参阅下面的堆栈跟踪: ActivityThread.handleCreateService(ActivityThread$CreateServiceData) 行:2943 服务为空。服务中不会调用 onCreate 或 onStartCommand()。
不幸的是,我不能为此使用处理程序,因为没有从活动中调用服务类的构造函数。 如您所见,我尝试了很多事情并认真阅读了一些内容,但显然我仍然缺少一些东西。 我会给你我目前正在尝试的代码版本,它产生了上面的堆栈跟踪。这段代码没有建立在 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() 后立即崩溃。错误文本在上面的介绍中。
【问题讨论】:
标签: android binding service android-intent data-transfer