Я новичок в Android и портирую программу на C # на Android. В большинстве случаев все идет хорошо, но у меня есть длительная проблема, связанная с невозможностью привязки к одному из моих сервисов.
Я хотел запустить и привязать к сервису, чтобы получить sendBroadcast (намерение) от сервиса. Намерение включает в себя пакет данных для отображения в пользовательском интерфейсе с использованием sendBroadcast (намерение), но он возвращает нулевой указатель, предположительно, потому что он не подключен к действию должным образом.
Я следовал очень многим учебным пособиям, включая предложения на этом сайте, которые казались довольно логичными и, по сообщениям, работали.
Такие как
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 ()! НО bool tmp из bindservice () возвращает 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 () действия. Текст ошибки находится во введении выше.