2017-04-13 13 views
8

現在、私はAndroidプロジェクトを作成中です。サービスから実行中のアクティビティでメソッドを呼び出す

これまでのところ、私は特にFirebaseInstanceIdServiceとFirebaseMessagingService、Firebaseを実装している:

public class FirebaseIDService extends FirebaseInstanceIdService { 
private static final String TAG = "FirebaseIDService"; 

private Context context; 

@Override 
public void onTokenRefresh() { 
    context = getApplicationContext(); 
    // Get updated InstanceID token. 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
    Log.e(TAG, "Refreshed token: " + refreshedToken); 

    SharedPreferences sharedPreferences = context.getSharedPreferences("token", context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putString("token", refreshedToken); 
    editor.commit(); 

    sendRegistrationToServer(refreshedToken); 
} 

/** 
* Persist token to backend. 
* @param token The new token. 
*/ 
private void sendRegistrationToServer(String token) { 
    SendRegistrationKey task = new SendRegistrationKey(context); 
    task.execute(token); 
} 

}

public class MessagingService extends FirebaseMessagingService { 

private static final String TAG = "MsgService"; 

/** 
* Called when message is received. 
* 
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging. 
*/ 
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.e(TAG, "From: " + remoteMessage.getFrom()); 

    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.e(TAG, "Message data payload: " + remoteMessage.getData()); 
    } 

    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 
     Log.e(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 

     sendNotification(remoteMessage); 
    } 

    // Also if you intend on generating your own notifications as a result of a received FCM 
    // message, here is where that should be initiated. See sendNotification method below. 
} 
// [END receive_message] 

private void sendNotification(RemoteMessage remoteMessage) { 
    RemoteMessage.Notification notification = remoteMessage.getNotification(); 
    PushNotificationManager PNManager = PushNotificationManager.getInstance(getApplicationContext()); 
    PNManager.buildNotification(notification.getTitle(), notification.getBody()); 
} 

私が達成したい何かは以下の通りです:

アプリケーションがバックグラウンドになったら、通知センターに簡単な通知をしたいだけです。 (これはすでに動作しています)

しかし、アプリケーションがフォアグラウンドにあり、現在実行中の場合、別の動作が必要です。 プッシュ通知を消費し、代わりにアラートを表示したいとします。

私の質問は、サービスから実行中のアクティビティとやり取りする方法、または意図した動作を達成する正しい方法は何ですか? Therは単純な魂でなければなりません、そうですか?事前に

おかげ

+0

サービスからsendBroadcastを登録し、活動中のアプリケーションを実行するための優先mothodチェックの上、放送 – X3Btel

答えて

1

これで試してみてください。実行中のすべてのアプリケーションのための

この方法の確認、および現在のアプリがバックグラウンド状態またはフォアグラウンド状態にあるかどうかをtrueまたはfalseを返します。

public static boolean isAppIsInBackground(Context context) { 
     boolean isInBackground = true; 
     ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { 
      List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses(); 
      for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) { 
       if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
        for (String activeProcess : processInfo.pkgList) { 
         if (activeProcess.equals(context.getPackageName())) { 
          isInBackground = false; 
         } 
        } 
       } 
      } 
     } else { 
      List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
      ComponentName componentInfo = taskInfo.get(0).topActivity; 
      if (componentInfo.getPackageName().equals(context.getPackageName())) { 
       isInBackground = false; 
      } 
     } 

     return isInBackground; 
    } 
+0

のために聞きます現在のアプリがバックグラウンド状態であるかフォアグラウンド状態であるかをtrueまたはfalseで返します –

+0

どの情報がどこにありますか? –

4

書き込みアプリケーションクラスでこのコード

public Context currentactvity = null; 
public Context getCurrentactvity() { 
    return currentactvity; 
} 

public void setCurrentactvity(Context currentactvity) { 
    this.currentactvity = currentactvity; 
} 

書き込みonresume方法各アクティビティで、ヌル

// in onresume 
MyApplication.getInstance().setCurrentactvity(this); 

// in onpause 
MyApplication.getInstance().setCurrentactvity(null); 

を設定onpause方法でこのコード今あなたは、サービスクラスからのアクティビティメソッドを呼び出すことができます

if (MyApplication.getInstance().getCurrentactvity() != null && MyApplication.getInstance().getCurrentactvity() instanceof youractivityname) { 
      ((youractivityname) MyApplication.getInstance().getCurrentactvity()).youmethodname(parameter); 

     } 
+0

それは素晴らしいです、それは私が探していたものです(y) –

2

サービスから実行中のアクティビティとやりとりする方法、または意図した動作を達成する正しい方法は何ですか?

イベントバス(つまり、GreenRobot'sまたはlocal broadcast)を使用するのが最善の方法です。あなたの活動は、onResume()のリスナーを登録し(そしてonPause()に登録を解除します)、あなたのサービスは時間が来たらメッセージをブロードキャストします。

主な利点は、両方の要素(サービスとアクティビティ)を完全に分離しておくことです。アクティビティのメソッドを直接呼び出す最悪の解決策を避けることもできます。

あなたがバックグラウンドにいるかどうかを知るには、アプリケーションのGreenRobot'sActivityLifecycleCallbacksを利用することをお勧めします。そこから利益を得られないという報告はありません。

0

1を試してみてください。あなたの活動のカスタム放送受信機

context.registerReceiver (myBroadcastReceiver, new IntentFilter ("CUSTOM_ACTION")); 
private final BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive (Context context, Intent intent) { 

     //Do something 
    } 
}; 

2.あなたのサービスから放送送信

Intent intent = new Intent ("CUSTOM_ACTION"); 
context.sendBroadcast (intent) 
+1

暗黙のブロードキャストはAndroid O. –

+0

+1で動作しません。更新していただきありがとうございます。答えを更新しました。 "マニフェストの受信者を宣言するのではなく、Context.registerReceiver()を呼び出して実行時に受信者を作成してください。 https://developer.android.com/preview/features/background.html#broadcasts – Pehlaj

関連する問題