2017-05-09 63 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