Иерархия приложения нарушается, когда приложение получает push-сообщение с приложением, не запущенным в Android? - PullRequest
0 голосов
/ 24 октября 2011

Я реализовал C2DM в приложении, и, кажется, все работает правильно, когда приложение работает. Но в случае, если приложение не запущено и сообщение получено. При нажатии на push-сообщение в панели уведомлений вызывается отдельное действие. Это действие можно назвать PushMsgHandlerActivity. Из этого действия можно перенаправить на другое действие в приложении. Скажем, пользователь нажимает кнопку в PushMsgHandlerActivity и перенаправляется в действие A, которое является действием запуска. Отсюда, если пользователь нажмет кнопку «Назад», то перейдет к виду, который был там до открытия push-сообщения. Если теперь кнопка «Домой» удерживается нажатой, и мы выбираем приложение оттуда, тогда вместо запуска активности запуска приложение снова запускает PushMsgHandlerActivity. Я полагаю, причина в том, что это действие было начато сначала для приложения.

В любом случае начать активацию запуска в этом случае.

Обратите внимание, что эта проблема возникает только тогда, когда получено push-сообщение и приложение не запущено. В противном случае приложение работает и ведет себя правильно.

1 Ответ

0 голосов
/ 24 октября 2011

Если вы никогда не хотите, чтобы пользователь возвращался в PushMsgHandlerActivity, попробуйте отключить историю для этого действия, как описано здесь , добавив флаг android:noHistory="true" в файл манифеста в разделе для этого. деятельность. Это должно привести пользователя к этому действию только тогда, когда вы отправите его туда (нажав на push-сообщение).

Вот простой пример, который, кажется, делает то, что вы хотите. Он имеет два действия: NotifyMainActivity, которая немедленно запускает уведомление, и HandleNotificationActivity, которая вызывается при нажатии на уведомление.

NotifyMainActivity:

public class NotifyMainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

        int icon = R.drawable.ic_launcher;
        CharSequence tickerText = "Hello";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);

        Context context = getApplicationContext();
        CharSequence contentTitle = "My notification";
        CharSequence contentText = "Hello World!";
        Intent notificationIntent = new Intent(this,
                HandleNotificationActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle, contentText,
                contentIntent);

        mNotificationManager.notify(1, notification);
    }
}

HandleNotificationActivity:

public class HandleNotificationActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handler);
    }

    public void startMain(View view) {
        Intent i = new Intent(this, NotifyMainActivity.class);
        startActivity(i);
        finish();
    }
}

handler.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="startMain"
        android:text="Main" />
</LinearLayout>

Я проверил, запустив основное действие, которое создает уведомление. Затем нажмите кнопку назад, чтобы перейти на домашний экран. Нажмите на уведомление, которое запускает действие обработчика. Затем нажмите кнопку Main и нажмите назад. Он не вернет вас к обработчику, так как он вызвал finish() сам по себе. Надеюсь, этот пример немного прояснит ситуацию.

...