1

私は、ユーザーの所在地を取得し、その目的地の緯度と経度をブロードキャストするサービスを持っています。Androidの2つの異なるアクティビティから開始したサービスの結果にアクセスする

私はfirebaseからの新しいgeoFireエントリが入力されたときにプッシュ通知をユーザに送信できるようにするために、(バインドされたサービスとは対照的に)開始されたサービスである必要があると考えます。アプリが閉じていても半径になります。

現在、サービスはロケーションをブロードキャストするように設定されています。

ロケーションサービスが開始されたサービスであるとすれば、2つの別々のアクティビティからブロードキャストにアクセスする方法はわかりません。

私はそれが縛られたサービスであればこれを達成することができると信じていますが、私は無期限に生き続けるため、何をすべきかはわかりません。

ここにはminimal example that demonstrates my issueがあります。

具体的には、放送受信機を登録することで最初のアクティビティで表示する緯度と経度を取得できますが、別の放送受信機を登録することで2番目のアクティビティで表示する緯度と経度を取得できません。

私はAndroid's documentation on Servicesを読みましたが、まだこの問題を解決するために何をすべきかはわかりません。

Android StudioのエミュレータNexus 5X API 25 x86でこれをすべてテストしました。

UPDATE 2017年11月8日:下記のEventBusソリューションを含むようにgithubプロジェクトを更新しました。イベントバス支店にあります。マスターブランチには依然として質問に関する問題のあるコードが含まれています。ビューに

git clone https://github.com/Atticus29/locationServiceMCV.git 
git checkout eventBus 

その後、オープンAndroidStudioまたは通常どおりに実行を選択し、ビュー/のIDE。

+1

アクティビティとサービスが同じアプリ(同じプロセス)に存在する場合、ブロードキャストの意図は必要ありません。サービスによって書かれたシングルトンを使用して、読者(この場合はあなたの活動)が読むことができます。 – m0skit0

+0

@ m0skit0あなたは何を提案しているのですか? – Atticus29

答えて

3

結果をブロードキャストすることは、この問題を解決する1つの方法です。しかし、プロジェクトにlibを追加したい場合は、Green Robot's EventBusを強くお勧めします。それは速いので、非常に軽量なlibです。また、Parcelableインターフェイスを実装しなくても、複雑なオブジェクトを簡単に投稿できます。

このlibは、あなたのケースでは、両方のアクティビティがサブスクライバになり、サービスがパブリッシャになるパブリッシャ/サブスクライバファッションで動作します。

Event Bus

まず第一に、あなたは以下のようにあなたのbuild.gradleファイルへの依存関係を追加する必要があります。

implementation 'org.greenrobot:eventbus:3.0.0' 

あなたはKotlinプロジェクトにしている場合は、この依存関係を追加:

その後
kapt 'org.greenrobot:eventbus-annotation-processor:3.0.1' 

、アプリを通して、あなたのデータを運ぶために責任を負うことになります。イベントのクラスを定義します。これは、ServiceからActivityまで行うことができます。 Fragmentから別のものへアクティビティ間など。

public class MessageEvent { 
    public double lat; 
    public double lng; 
    // Add additional fields here if needed 

    public MessageEvent(double lat, double lng) { 
     this.lat= lat; 
     this.lng = lng; 
    } 
} 

その後、あなたのActivityでイベントを購読する必要があります。

public class MyActivity extends AppCompatActivity { 
    // ... 

    @Override 
    public void onResume() { 
     super.onResume(); 
     // This line will register your Activity to the EventBus 
     // making sure that all the methods annotated with @Subscribe 
     // will be called if their specific Events are posted. 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     // This line will unregister your Activity. 
     // It's a good practice to put this on the onPause() method 
     // to make your event handling system tied to the Activity lifecycle. 
     EventBus.getDefault().unregister(this); 
    } 

    // The threadMode MAIN makes sure this method is called on the main Thread. 
    // But you could also set it up to be called on other threads if needed. Check the docs for more info. 
    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) 
    public void onMessageEvent(MessageEvent event) { 
     /* Call this line below if you want to remove the sticky event. 
     * That will prevent that this event will be seen by other subscribers once they subscribe. 
     * In your specific use case, you don't have to remove the sticky event here. 
     */ 
     // EventBus.getDefault().removeStickyEvent(event); 
     double lat = event.lat; 
     double lng = event.lng; 
     // Do whatever you want with the data. 
    }; 
} 

これを実装すると、イベントを送信する準備が整いました。新しい緯度/経度情報を取得すると、Serviceの内部で次のコードを呼び出します。

EventBus.getDefault().postSticky(new MessageEvent(lat,lng)); 

あなたはどのようにセットアップの詳細を読み、EventBus on the docs、またはthis tutorial上をカスタマイズすることができます。

+0

ありがとう!私はあなたの提案をうまく実装し、私の最初の活動でEventBusをうまく使用していることを実証しました。しかし、私の2番目の活動はまだそれを得ていないようです。助言がありますか?この質問の冒頭にリンクされているレポの "eventBus"ブランチにあなたのサンプルを実装しました。 – Atticus29

+1

さて、私はそれを得た。スティッキーイベントは、あなたが望む限り、イベントバス上にとどまります。通常、私はそれを読むのは初めてですが、それはあなたのユースケースに合っていません。問題は次の行にあります:https://github.com/Atticus29/locationServiceMCV/blob/eventBus/app/src/main/java/fisherdynamic/locationservicemcv/MainActivity.java#L78 - 両方のアクティビティでそれを削除します。サービスが破棄されると、 'EventBus.getDefault()。removeAllStickyEvents()'を呼び出すことができます。 – Mauker

+0

このようにして、両方のアクティビティでEventBusに登録すると、スティッキーイベントを読み取ることができ、最新のLat Lngイベントがサービスによって通知されます。 – Mauker

関連する問題