Android:无法在重新启动时替换服务中的bundle

时间:2013-08-27 23:15:35

标签: android service bundle onresume

我正在尝试通过使用捆绑来通过对服务中的活动的挂起意图传递一些值。如果应用程序刚刚启动,一切正常,但当应用程序处于恢复模式时,虽然我的服务从远程服务器接收新值并将它们放入pendingintent以传递给活动,但活动显示旧值。这是服务方面的代码:

    private void sendNotification(String wholemsg) {
    mNotificationManager = (NotificationManager) this
            .getSystemService(Context.NOTIFICATION_SERVICE);



    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.setAction(Intent.ACTION_MAIN);
    notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    /* Do something to extract salesID and notificationmessage from wholemsg
    ....
    ....
    ....
    salesID=....
    notificationmessage=...
    ....
    */


    Bundle bundle=new Bundle();
    bundle.putString("msg", notificationmessage);
    bundle.putString("strsalesID", salesID);    

    notificationIntent.replaceExtras(bundle);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            notificationIntent,        PendingIntent.FLAG_ONE_SHOT+PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this)

    .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("AppV001 Notification")
            .setStyle(new NotificationCompat.BigTextStyle().bigText(notificationmessage))
            .setContentText(notificationmessage);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

}

这是关于我的活动的onRestart方法:

           @Override
        protected void onRestart() {

    super.onRestart();


    NotificationManager mNotificationManager = (NotificationManager) this
            .getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.cancel(1);
    try {

        Intent intent = getIntent();
        if (intent.hasExtra("msg") && intent.hasExtra("strsalesID")) {
            String strmsgtitle = intent.getStringExtra("msg");
            salesID = intent.getStringExtra("strsalesID");
            titletext.setText(getString(R.string.str_ettitle) + salesID);
        } 
    } catch (Exception ex) {
        return;
    }

}

问题是当应用程序从隐藏模式返回时,salesID保持先前的值。似乎服务在隐藏时无法更改活动包。

非常感谢你的时间!

1 个答案:

答案 0 :(得分:0)

我发现我的代码和我想在这里发布的内容有什么问题,万一其他人遇到同样的问题。 acj是对的,我的启动模式出现问题。我的原始应用程序清单是:

    <activity
        android:name="com.example.appv001.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

由于未声明启动模式,因此自动采用标准模式。我们可以有四个launchMode (look at this)

  

     

'标准'是默认值。这四个值分为两个   基团:

     
      
  • 'standard'和'singleTop'可以实例化多个活动实例,实例将保留在同一个任务中。
  •   
  • 对于'singleTask'或'singleInstance',活动类使用单例模式,该实例将是a的根活动   新任务。
  •   

由于我的活动具有标准启动模式,因此当服务调用它时,会创建一个新的活动实例,并将意图传递给此新活动。因此,不是调用“onNewIntent()”,而是调用“onCreate”方法,换句话说,从未调用“onNewIntent()”来设置包等。我将活动清单更改为此并设置启动模式to singleTask(android:launchMode =“singleTask”)问题刚刚解决:

    <activity
        android:name="com.example.appv001.MainActivity"
        android:label="@string/app_name" 
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

我希望这有助于其他人。