如果我的应用程序处于活动状态,我希望在收到GCM时在当前活动中显示一个弹出窗口。
我想在GcmIntentService中访问我当前的活动,但我不认为有可能或一种进行的好方法...
谁能帮我?
解
在我的GcmIntentService.java中:
@Override
protected void onHandleIntent(Intent intent) {
...
Intent broadCastIntent = new Intent("client_notifications_broadcast");
broadCastIntent.putExtra("data", extras.getString("other"));
LocalBroadcastManager.getInstance(this).sendBroadcast(broadCastIntent);
...
}
在MainActivity扩展的所有活动中,我都希望弹出窗口,我添加了一个具有自定义布局的Dialog:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String dataString = intent.getStringExtra("data");
final Dialog dialog = new Dialog(ClientMainActivity.this);
dialog.setContentView(R.layout.custom_dialog_popup);
dialog.setTitle("Title...");
// set the custom dialog components - text, image and button
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("Android custom dialog example!");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
TextView dialogButton = (TextView) dialog.findViewById(R.id.dialogButtonOK);
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
Log.d("receiver", "Got message: " + dataString);
}
};
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("client_notifications_broadcast"));
}
最佳答案
好吧,您可以使用LocalBroadcast
。请参见LocalBroadcast Manager。
关于如何实现,在how to use LocalBroadcastManager?上有一个很好的例子。
LocalBroadcast Manager是一个助手,用于注册Intent广播并将其发送到流程中的本地对象。您正在广播的数据不会离开您的应用程序,因此无需担心泄漏私人数据。
您的活动注册了此本地广播。从服务中,您从LocalBroadcast
内部发送一个onMessage
(说,嘿,我收到了一条消息。显示它的活动)。然后在您的Activity
中,您可以收听广播。这样,如果活动处于最前列/处于活动状态,它将接收广播,否则不会接收。因此,每当收到该本地广播时,如果活动处于打开状态,则可以执行所需的操作。
如果您想为整个应用程序做,则可以使所有活动扩展为抽象活动。在这个抽象活动类中,您可以为“ LocalBroadcast”注册它。另一种方法是在所有活动中注册LocalBroadcast(但随后您将不得不管理如何只显示一次消息)。
希望对您有帮助。