En passant les données d'un BroadcastReceiver à MainActivity fonctionne correctement une seule fois

voix
0

J'ai un PushNotificationReceiver (extends BroadcastReceiver)et MainActivity. Le récepteur envoie des données (par exemple la valeur de chaîne New value« ) au MainActivitymoyen d' un Intent. Ensuite , MainActivitymet à jour son TextViewavec cette valeur. Cela fonctionne bien jusqu'à ce que je change cette TextViewvaleur à une autre valeur (par exemple le remettre à UNSPECIFIED« ) et déplacer l'activité à fond et avant - plan. Le MainActivityest restauré et son TextViewcontient « New value», mais je pensais que ce serait « UNSPECIFIED» - c'est le problème .

Quel est le problème avec mon application?

L'ensemble du projet proto peut être téléchargé ici .

Voici mon code MainActivity

private TextView tvValue;
private EditText etNewValue;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tvValue = (TextView)findViewById(R.id.value);
    etNewValue = (EditText)findViewById(R.id.new_value);

    findViewById(R.id.reset).setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View v) {
            tvValue.setText(getResources().getString(R.string.not_specified));
        }
    });

    findViewById(R.id.send_notification).setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View v) {
            sendNotification(etNewValue.getText().toString());
        }
    });

    processDataFromBroadcast(getIntent());        
}

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    processDataFromBroadcast(intent);
}

private void sendNotification(String value){
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    String title = Proto App Notif;

    Notification notification = new Notification(
            android.R.drawable.ic_notification_overlay,
            title,
            System.currentTimeMillis());
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    Context ctxApp = getApplicationContext();

    Intent notificationIntent = new Intent()
        .setAction(PushNotificationReceiver.ACTION_NOTIFICATION)
        .putExtra(value, value);
    PendingIntent contentIntent = PendingIntent.getBroadcast(
            ctxApp, 
            0, 
            notificationIntent, 
            PendingIntent.FLAG_UPDATE_CURRENT);     

    notification.setLatestEventInfo(
            ctxApp,
            title,
            value,
            contentIntent);

    notification.audioStreamType = AudioManager.STREAM_NOTIFICATION;

    mNotificationManager.notify(1, notification);           
}

private void processDataFromBroadcast(Intent intent) {
    if (!intent.hasExtra(value)){
        return;
    }

    String val = intent.getStringExtra(value);

    tvValue.setText(val); // Updating my activity look
}

PushNotificationReceiver

private static final String LOG_CAT = PushNotificationReceiver;
static final String ACTION_NOTIFICATION = com.mobiwolf.proto.NOTIFICATION_RECEIVER;

@Override
public void onReceive(Context context, Intent intent) {
    if (!intent.getAction().equals(ACTION_NOTIFICATION)) {
        return;
    }

    String value = intent.getStringExtra(value);

    Log.d(LOG_CAT, Received notification message: +value); // Log always contains the value sent on first time

    Intent i = new Intent();
    i.setClass(context, MainActivity.class);
    i.putExtra(value, value);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(i);
}

et manifeste

    <receiver android:name=com.mobiwolf.proto.PushNotificationReceiver>
        <intent-filter>
            <action android:name=com.mobiwolf.proto.NOTIFICATION_RECEIVER />
        </intent-filter>
    </receiver>    

    <activity android:name=.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>
Créé 06/02/2011 à 13:05
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

Remplacer

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

par

i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
Créé 09/03/2011 à 10:54
source utilisateur

voix
0

Définir une public static boolean newUpdate;variable à mettre truejuste avant context.startActivity(i);. Puis, quand dans votre MainActivityvous vérifiez l'intention est extraavec elle, vérifier que newUpdateest true, et si elle est, remettre à falseet mettre à jour votre TextViewchamp. La dernière fonction se présente comme suit

private void processDataFromBroadcast(Intent intent) {
   if ( !intent.hasExtra("value") || (newUpdate == false) ){ //So only new updates are processed.
      return;
   }
   newUpdate = false; //This action will not be repeated unless another notification arrives
   String val = intent.getStringExtra("value");

   tvValue.setText(val); // Updating my activity look
}
Créé 11/05/2012 à 04:15
source utilisateur

voix
0

Pour résoudre ce problème, j'ai ajouté déclencheur global statique

  /**
  * This class triggers whether pushnotification was handled by MainActivity
  * (Preventing handling this push notification twice when the MainActivity 
  * is moved to background and restored from background
  */
  public final class PushNotifHandledTrigger {
private static boolean handled = true;

public static boolean wasHandled(){
    return handled;
}

public static void set(){
    handled = true;
}

public static void reset(){
    handled = false;
}
  }

Alors avant startActivity je réinitialiser ce déclencheur et mis après la manipulation (et bien sûr effectuer la manipulation que si le déclencheur est pas défini)

Créé 07/02/2011 à 10:59
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more