广播接收器Android 4.0中不影响共享偏好(可能3.1+)(Broadcast receive

2019-09-17 01:22发布

所以,我确实彻底搜查的答案,我的问题; 通常我可以很容易地找到答案几乎任何东西。

反正基本上我有一个告警管理器设置最终设定的广播接收机。 在接收机内部,它决定意图迄今尚未收到,删除共享的首选项,然后将启动该活动的通知。 问题是,在我的手机用4.0共享首选项没有被成功删除,但以往任何电话时,我已经试过(2.2,2.3),它完美的作品。

我最终找到的Android 3.1的文档和FLAG_INCLUDE_STOPPED_PACKAGES实施。 我试着扔在那的意图,以防万一,但它仍然是行不通的。 无论哪种方式,它不是,这是问题的活动的开展,但简单的删除一个共享的偏好。

我希望这是很清楚! 我会在下面的一些代码。

这就是意图开始:

Calendar cal = Calendar.getInstance();
int seconds = 5 * 60; // 1 * 24 * 60 * 60;
cal.add(Calendar.SECOND, seconds);

Intent intent = new Intent(SetAlertActivity.this, ReminderReceiver.class);
intent.putExtra("id", "FAlert");
//intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), FRAUD_ALERT_CODE, intent, 0);

AlarmManager alertManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alertManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);

settingsEditor = alertSettings.edit();
settingsEditor.putLong("AlertTime1", cal.getTimeInMillis());
settingsEditor.commit();

然后,广播接收器的onReceive():

    nContext = context;
    alertSettings = nContext.getSharedPreferences(MainActivity.PREFERENCE_FILENAME, 0);
    if (intent.getStringExtra("id").equals("FAlert"))
    {

        settingsEditor = alertSettings.edit();
        settingsEditor.remove("AlertTime1");
        settingsEditor.commit();

        String ns = Context.NOTIFICATION_SERVICE;
        int icon = R.drawable.ar_icon;
        CharSequence tickerText = nContext.getString(R.string.notification_ticker);
        CharSequence contentTitle = nContext.getString(R.string.notification_title);
        CharSequence contentText = nContext.getString(R.string.notification_text);
        long when = System.currentTimeMillis();

        NotificationManager mNotificationManager = (NotificationManager) nContext.getSystemService(ns);
        Notification notification = new Notification(icon, tickerText, when);

        Intent notificationIntent = new Intent(nContext, SetAlertActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(nContext, 135, notificationIntent, 0);

        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.defaults |= Notification.DEFAULT_LIGHTS;
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notification.setLatestEventInfo(nContext, contentTitle, contentText, contentIntent);
        mNotificationManager.notify(NOTIFICATION_ID, notification);
    }

所以,正如我前面提到的,在我的设备上的4.0(我没有任何3.x设备)的

settingsEditor = alertSettings.edit();
settingsEditor.remove("AlertTime1");
settingsEditor.commit();

部分不工作。 该活动将正常打开,但“AlertTime1”仍然存在。 在2.2和2.3的设备的“AlertTime1”被成功删除。

感叹 :d

谢谢你的帮助!!

哦,万一它的需要,这是我的接收器清单:

<receiver
    android:name="ReminderReceiver"
    android:process=":remote" >
</receiver>

这是区别在哪里显示:

    alertSettings = getSharedPreferences(AlertRenewActivity.PREFERENCE_FILENAME, 0);
    settingsEditor = alertSettings.edit();
    if (alertSettings.contains("AlertTime1"))
    {
        alertTime = alertSettings.getLong("AlertTime1", 0);
        timeLeft = (int) ((alertTime - System.currentTimeMillis()) / (1000L));
        daysLeft = timeLeft / (60 * 60 * 24);
        daysLeftView.setText(Integer.toString(daysLeft));
        setAlert.setEnabled(false);
        setAlert.setTextColor(R.color.dark_text);
    }
    else
    {
        daysLeftView.setText(R.string.no_alert_set);
    }

在我的旧手机,它正确地重置为说:“毫无戒备集”,但是,从4.0的手机仍然显示左“0”的日子(这是它说什么,因为我是唯一的警报设置为5分钟左右进行测试) 。 基本上,用户不能设置一个新的警报,因为它已经无法正常复位,并再次,仅在4.0的手机我想:P

Answer 1:

使用Context.MODE_MULTI_PROCESS作为第二个参数getSharedPreferences()。 问题是,你有广播接收器在一个单独的进程从活动的运行,并作为Android 3.0的多进程访问共享偏好的默认行为的改变。 这应该可以解决这个问题为大家讲解4.x的设备。

但是,在的Android 2.3中的错误导致从多个进程共享偏好同时访问未在某些情况下可靠地工作。 我们遇到了这个和它感到很失落,因为它是难以重现和解释(可能是某种计时问题)。



Answer 2:

我最终什么事做的只是有在说活动本身的支票“如果报警时间小于0,删除报警时间。” 这是一个变通; 我没有收到,不幸的是工作的任何其他的答案。



Answer 3:

在清单中的接收者属性,你应该删除Android:过程=“远程”。 SharedPreferences不会用新的流程和工作:远程声明“做任何进程ID”。



Answer 4:

我知道这是一个老问题,但也许我的回答将是其他人谁面临这样的问题该天有帮助。 我只是找到了一个解决方案,它为我工作

做一个服务,并实现你想要它的工作,然后只是从你的广播接收器,这意味着你的接收器的唯一工作就是打电话,它将处理你想要做的工作服务调用服务。



Answer 5:

在简单的答案是这样的:甭管在接收器做了许多事。 相反,意图调用在同一封装架构中的另一个活动的踢,你就可以很容易地做到这一点。



文章来源: Broadcast receiver not affecting shared preferences in Android 4.0 (probably 3.1+)