この Android アプリを動作させるのに少し問題があります。基本的に、メイン メニューで作成したサービスを開始すると、これで問題なく動作します。私が抱えている問題は、メイン アクティビティから呼び出すことができるオプション アクティビティがあり、オプション アクティビティがメイン アクティビティで開始したサービスとやり取りできるようにすることです。
このページhttp://developer.android.com/guide/components/bound-services.htmlを読みましたが、すべてを正しく行ったようですが、サービスのメンバー関数にアクセスしようとすると、プログラムがクラッシュします. 特に、サービス内のハッシュマップにアクセスしようとすると発生します。
オプション メニュー アクティビティの onCreate クラスで:
Intent passedintent = getIntent(); // gets the intent sent to the activity
//Intent intentShim = new Intent(this, ShimmerService.class);
// binds the shimmer service to this activity
boolean isconnected = getApplicationContext().bindService(intent, shimmerServiceConnection, Context.BIND_AUTO_CREATE);
// register the shimmer receiver
registerReceiver(shimmerReceiver, new IntentFilter("com.jpl_347E.bio_sigapp.ShimmerService"));
PassedIntent Intent は、このアクティビティを開始するメイン アクティビティからインテントを取得します。最初に、これを
getApplicationContext().bindService(....)
機能しますが、機能していないようです。そこで、メイン メニュー アクティビティでサービスを作成するために使用したインテントを反映した新しいインテントを作成しました。オプションメニューアクティビティにもこれらの機能があります
private ServiceConnection shimmerServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
LocalShimmerBinder binder = (LocalShimmerBinder)arg1;
serviceshim = binder.getService();
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
private BroadcastReceiver shimmerReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getIntExtra("ShimmerState", -1) != -1)
;//TODO
}
};
これは、メイン メニュー アクティビティにあるコードとほとんど同じで、そこでサービスを完全に見つけることができます。エラーを追跡したと思います
binder.getService()
この関数は null を返します。次に、参照変数が指していない (null を指している) クラスのハッシュマップにアクセスしようとしました。なぜbinder.getService()がメインメニュー機能ではなくここでnullを返すのかわかりません。サービスを再度開始する必要があるのでしょうか。メインでサービスを開始したら、このアクティビティで再度サービスを開始する必要はないと考えました。