Диалог уведомлений о сообщениях Android поверх других действий - PullRequest
0 голосов
/ 25 ноября 2011

Как получить диалоговое окно уведомления о сообщениях Android поверх других действий?

Я ищу решение этой проблемы, но решение пока не найдено. Сейчас я занимаюсь разработкой приложения для социальных сетей, в котором мне нужно показывать диалоговое окно с уведомлением всякий раз, когда пользователь получает какое-то сообщение от другого, и для достижения этого я использовал приемник вещания, и он работает нормально.

Проблема в том, как отобразить диалоговое окно уведомлений поверх другого приложения.

Ответы [ 3 ]

4 голосов
/ 25 ноября 2011

Да, это возможно.Макет Main.xml имеет один текст для редактирования и кнопку.Макет Messagebox имеет одну кнопку.Здесь вы можете изменить макет сообщения на любой другой.

Файл 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();
            }
        });
    }
}

И добавьте эти две строки в XML-файл манифеста Android:

<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>
3 голосов
/ 06 декабря 2011

Как уже говорили другие в своих ответах, запускать Activity из фона, чтобы привлечь внимание пользователя, не рекомендуется.Однако некоторые ситуации требуют этого;примеры в самом Android включают в себя будильники, входящие звонки и уведомления о разряде батареи.

В Gingerbread поле fullScreenIntent было добавлено к объектам уведомлений;Это стандартный и удобный способ опубликовать Уведомление, которое также запускает Активность, чтобы действительно привлечь внимание пользователя.Начиная с Gingerbread, все перечисленные выше компоненты платформы (аварийные сигналы и т. Д.) Используют эту технику для отображения своих предупреждений.Это рекомендуемый способ сделать то, что вы просите.

2 голосов
/ 25 ноября 2011

Как указано в документации на Уведомления в строке состояния :

Фоновая служба не должна никогда запускать действие самостоятельно для получения взаимодействия с пользователем.

Поэтому я настоятельно советую вам не делать этого, но вместо этого вам следует использовать уведомление в строке состояния.

...