2016-08-16 12 views
0

私のアプリケーション構造についてのアドバイスが必要です。それはGCMを使用したメッセージングに関するものです。 私はGcmListenerService(メッセージデータ付き)でonMessageReceived呼び出しを受け取ります。 は今2例があります。

a)はすでに存在し活動スタック内のチャットの活動であり、活動がその見解

B)は開いたチャットはありませんが更新されますように、私はそこには、新しいメッセージに関する情報を意図を送信する必要があります今のところ活動しているので、通知を表示するだけです。
重要なことは、スタックの上にアクティビティがある場合、通知を表示したくないということです。サービス中に、アクティビティスタックに特定のアクティビティがあるかどうかを確認してください。

アクティビティスタックにチャットアクティビティがあるかどうかを検出するにはどうすればよいですか?

+0

あるだけ – pskink

+0

@pskinkそれにバインドされたすべてのクライアントがある場合は、「バウンドローカルサービス」のパターンとあなたのサービスを知っているだろう使用するので、私が必要サービス(通常のもの)のインスタンスを作成し、それにチャットアクティビティをバインドしますか? GcmListenerServiceにバインドすることはできません。 –

+0

'GcmListenerService'は' service'を拡張して、その上で 'bindService'を呼び出すことができます。 – pskink

答えて

0

ActivityManagerを使用すると、現在のタスクとそのスタックをチェックすることができます。だから、

、活動が最後のものであるかどうかを判断するために:

要求マニフェストでandroid.permission.GET_TASKS権限を。上記のコードは、あなたが単一のタスクを持っている場合にのみ有効になることを

ActivityManager mngr = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 

List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10); 

if(taskList.get(0).numActivities == 1 && 
    taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) { 
    Log.i(TAG, "This is last activity in the stack"); 
} 

は、次のコードを使用してください。あなたのアプリケーションに多数のタスクが存在する可能性がある場合 - 他のtaskList要素をチェックする必要があります。タスクのタスクについての詳細を読み、バックスタック

そして、第二の溶液は

public boolean isRunning(Context ctx) { 
     ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); 
     List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE); 

     for (RunningTaskInfo task : tasks) { 
      if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) 
       return true;         
     } 

     return false; 
    } 
関連する問題