2017-05-09 65 views
0

我有一個問題,我想我可能不會造成它。在我的活動中,數據按鈕點擊發布到服務器。廣播接收器不能在電話上工作

然後,服務器處理此請求,並使用您的號碼在您的手機上啓動網絡提示,例如USSD中的提示。

現在就是提示出現的那一刻,用戶需要選擇一個選項並輸入他們的PIN碼完成請求。在服務器驗證完這個請求之後,我使用FCM發佈到應用程序。現在,當消息服務獲取此請求時,我將廣播發送到當前活動。

廣播在我的活動中收到,通知應用程序讓用戶參與最終活動。

現在,這在我的模擬器上完美工作,但在我的手機上它沒有。我檢查了我的日誌並注意到接收器不會在電話上被呼叫,我不知道爲什麼。我有一種感覺,它與應用程序失去焦點或提示出現時有關。我不太確定。

編輯:

MyFireBaseMessagingService.java:

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

    Map<String, String> data = remoteMessage.getData(); 
    if (data.containsKey("method") && data.containsKey("action")) { 
     String action = data.get("action"); 
     switch (action) { 
      case "/checkout": 
       Log.d("onMessageReceived", data.toString()); 
       Intent i = new Intent(); 
       i.setAction("com.xxxxxx.xxxxxx.CHECKOUT"); 
       i.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
       i.putExtra("data", new JSONObject(data).toString()); 
       sendBroadcast(i); 
       break; 
      default: 
       Log.d("Default", action); 
       break; 
     } 
    } 

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

    // 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. 
} 

MyBroadcastReceiver.java:

private class MyBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     showProgress(false); 
     Intent checkoutIntent = new Intent(PaymentActivity.this, CheckoutActivity.class); 
     startActivity(checkoutIntent); 
    } 
} 

MyActivity.java:

@Override 
public void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter("com.xxxxxx.xxxxxx.CHECKOUT"); 
    filter.setPriority(999); 
    mBroadcastReceiver = new MyBroadcastReceiver(); 
    mContext.registerReceiver(mBroadcastReceiver, filter); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mContext.unregisterReceiver(mBroadcastReceiver); 
} 
+0

所以你說的一切工作正常,直到你的手機廣播接收器部分?你能證明你是如何實現接收器的嗎?有些代碼總是很好看 –

+0

是的,這就是我說的,我看到我的控制檯沒有錯誤,將編輯我的帖子並添加代碼。 – user3718908

+0

編輯我的帖子,你可以現在檢查代碼。謝謝。 – user3718908

回答

0

以下是您可以嘗試的方法。從onResumeunregisterReceiveronPause()刪除廣播registerReceiver

然後,添加一個新的類:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent checkoutIntent = new Intent(context, CheckoutActivity.class); 
     context.startActivity(checkoutIntent); 
    } 
} 

添加到您的清單(並確保更改操作):

<receiver 
    android:name=".MyReceiver" 
    android:enabled="true" 
    android:exported="false"> 
    <intent-filter> 
     <action android:name="com.xxxxxx.xxxxxx.CHECKOUT" /> 
    </intent-filter> 
</receiver> 

現在嘗試。
這樣,即使您的活動onPause()被調用,BroadcastReceiver上的onReceive()仍將被調用。

+0

試過這樣,它沒有工作。同樣的行爲。 – user3718908

0

如果「現在這在我的模擬器上完美工作,但在我的手機上卻不能。」我認爲你需要檢查android權限。

+0

您可以參考https://developer.android.com/training/permissions/requesting.html – Dungnbhut

+0

我不明白,我已經添加了我的清單文件的權限,我缺少什麼權限?我不明白你的意思。 – user3718908

+0

我認爲你的應用使用一些手機信息而不是註冊權限。 http://stackoverflow.com/questions/33036523/broadcast-receivers-not-working-in-android-6-0-marshmallow – Dungnbhut