相关疑难解决方法(0)

意图 - 如果活动正在运行,请将其置于最前面,否则启动一个新的(来自通知)

我的应用程序有通知,这是 - 很明显 - 没有任何标志,每次启动一个新的活动,所以我得到对方的顶部,这是错误的运行多个同样的活动.

我想要它做的是将通知挂起意图中指定的活动带到前面(如果它已在运行),否则启动它.

到目前为止,我所拥有的通知的意图/待定意图是

private static PendingIntent prepareIntent(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它有时会起作用,有时它不会......我觉得我已经尝试了每一个标志组合.

android android-intent android-activity android-pendingintent

122
推荐指数
5
解决办法
7万
查看次数

如何恢复通知而不重新创建活动?

我想我已经想到了这个问题,但在对这个问题进行一些调试之后:如何使通知无法删除/不可删除我刚刚意识到我的活动仍以随机顺序进入onCreated()和onDestroyed().

我的活动清单:

<activity
        android:name="***.***.***.*****"
        android:configChanges="orientation|keyboardHidden"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)

我也尝试过launchmodes singleTask,singleInstance.

我的通知意图代码:

Intent intent = new Intent(context, MyClass.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    //intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经尝试过看起来可能相关的每一面旗帜,但没有运气......

这会产生一些不需要的伪像,例如每次单击通知时重新启动AlarmManager并触发alarmmanager start-task.我想避免这种情况.

有什么建议?

编辑:我知道有很多像这样的问题,但提供的解决方案似乎没有在这里做到这一点......:/

Edit2:根据要求,这是我的班级:

package ***.***.***;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.PorterDuff;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log; …
Run Code Online (Sandbox Code Playgroud)

notifications android oncreate ondestroy

23
推荐指数
3
解决办法
2万
查看次数

忽略了FLAG_ACTIVITY_REORDER_TO_FRONT

我有一个带有项目列表的FragmentActivity,当应用程序在后台时,可以推送到该项目列表.

发生这种情况时,我想创建状态栏通知并提醒用户更新.
当用户单击通知时,活动应重新排序到前面并在屏幕上显示,同时在列表底部显示新项目.

所以我写了一个通知管理器,在用户设备上显示:

private static void createNotification(String title, String text,
    String largeIcon, String itemdId, Context mCOntext) {

Bitmap ic = BitmapFactory.decodeResource(mContext.getResources(),
    R.drawable.ic_launcher);
Intent intent = new Intent(mContext, MyFragmentActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.putExtra(MyFragmentActivity.SELECTED_ITEM_LIST_ID, DatabaseHelper
    .getItemListById(listId).getId());
PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent,
    0);

Notification noti = new NotificationCompat.Builder(mContext)
    .setContentTitle(title).setContentText(text)
    .setSmallIcon(R.drawable.ic_launcher).setContentIntent(pIntent)
    .setAutoCancel(true).setLargeIcon(ic).build();
noti.defaults |= Notification.DEFAULT_LIGHTS;
noti.defaults |= Notification.DEFAULT_VIBRATE;
noti.sound = Uri.parse("android.resource://"
    + mContext.getPackageName() + "/" + R.raw.user_gets_message);

NotificationManager nm = (NotificationManager) mContext
    .getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(0, noti);
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它似乎忽略了我的旗帜,当我导航到片段活动,然后转到我的主屏幕(应用程序的背景),并获得推送,当我点击通知时,应用程序创建一个新的活动(或片段)并显示新的一个而不是原始的新数据.(这意味着单击后退按钮可从历史堆栈中打开相同的活动(或片段).

我重写了活动的onNewIntent所有生命周期方法,我看到在后面点击时,被调用的方法是MyFragmentActivity.onStartMyFragmentActivity.onResume. …

android android-intent android-pendingintent

4
推荐指数
1
解决办法
5787
查看次数