0

この 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を返すのかわかりません。サービスを再度開始する必要があるのでしょうか。メインでサービスを開始したら、このアクティビティで再度サービスを開始する必要はないと考えました。

4

2 に答える 2

1

すでに機能する方法を見つけたと思いますが、簡単な提案がいくつかあります。

startService1)明示的に呼び出す必要はありません。その方法は、別のユースケース用です。それにバインドすると、必要に応じて が作成されますService

getApplicationContext2)から使用しないでくださいActivity。はActivityですContextので、 を渡しthisます。

于 2013-10-11T04:05:40.813 に答える
0

おっとっと!これは、ServiceConnection 関数が呼び出される前に、onCreate() でサービスを使用しようとしていたためです。

于 2013-10-11T04:00:26.767 に答える