其他活动之上的Android消息通知对话框

时间:2011-11-25 09:40:15

标签: android dialog notifications message

如何在其他活动之上获取Android消息通知对话框?

我正在寻找这个问题的解决方案,但仍然没有得到解决方案。现在,我正在开发一个社交网络应用程序,我需要在用户从另一个人那里收到一些消息时显示一个通知消息对话框,并实现我已经使用了广播接收器并且它工作正常。

问题是如何在另一个应用程序之上显示通知对话框。

3 个答案:

答案 0 :(得分:4)

是的,有可能。 Main.xml布局有一个编辑文本和按钮。 Messagebox布局有一个按钮。在这里,您可以将消息布局更改为您想要的任何内容。

File MyScheduledReceiver.java:

public class MyScheduledReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        Intent scheduledIntent = new Intent(context, MessageBox.class);
        scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(scheduledIntent);
    }
}

主要活动:

public class AndroidMessageBoxActivity extends Activity implements OnClickListener
{
    private EditText time;
    private Button btn;
    private AlarmManager alarm;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        time = (EditText) findViewById(R.id.editText1);
        btn = (Button) findViewById(R.id.button1);
        alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        int x = Integer.parseInt(time.getText().toString());

        Intent intent = new Intent(this, MyScheduledReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                this.getApplicationContext(), 234324243, intent, 0);

        alarm.set(AlarmManager.RTC_WAKEUP,
                  System.currentTimeMillis() + (x * 1000),
                  pendingIntent);
        Toast.makeText(this,
                       "Alarm set in " + x + " seconds",
                       Toast.LENGTH_LONG).show();
    }
}

的MessageBox:

public class MessageBox extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.messagebox);

        Button btn = (Button) findViewById(R.id.Ok);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();
            }
        });
    }
}

在Android清单XML文件中添加以下两行:

<receiver android:name="MyScheduledReceiver"></receiver>

<activity android:name="MessageBox" android:theme="@style/Theme.Transparent"></activity>

Filestyle.xml:

<resources>
    <style name="Theme.Transparent" parent="android:Theme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>
</resources>

答案 1 :(得分:3)

正如其他人在回复中所说的那样,不鼓励在后台启动活动以引起用户的注意。但是,有些情况需要这样做; Android中的示例包括时钟闹钟,来电和低电量警报。

在Gingerbread中,fullScreenIntent字段已添加到Notification对象中;这是发布通知的标准且方便的方式,该通知还启动了一个活动以真正引起用户的注意。从Gingerbread开始,我上面列出的平台组件(警报等)都使用这种技术来显示他们的警报。这是推荐的方式来做你想要的。

答案 2 :(得分:2)

Status bar notifications上的文件所述:

  

后台服务永远不会自行启动活动以接收用户互动。

因此,我强烈建议您不要这样做,但您应该使用状态栏通知。