web-dev-qa-db-fra.com

Envoyer une chaîne du service à l'activité

J'essaie d'envoyer une chaîne du service à mon activité principale avec diffusion. J'ai lu dans quelques forums qu'il y a 2 façons d'utiliser la diffusion. L'une consiste à enregistrer l'activité dans le manifeste et la deuxième consiste à le faire sur l'activité locale. Je voudrais savoir comment utiliser la deuxième méthode. J'ai essayé de le faire mais malheureusement je n'y suis pas parvenu.

Veuillez me dire ce que je fais mal.

Code de service

   public class MyGcmListenerService extends GcmListenerService {

private static final String TAG = "MyGcmListenerService";

// [START receive_message]
@Override
public void onMessageReceived(String from, Bundle data) {
    String typemessage = data.getString("typemessage"); // typeMessage = 0 or 1 = lock or unlock
    String datamessage = data.getString("datamessage"); // dataMessage = time and message that says lock or unlock

    Log.d(TAG, "TypeMessage: " + typemessage);
    Log.d(TAG,"DataMesaage:"+ datamessage);

    Intent in = new Intent();
    in.putExtra("TYPE",typemessage);
    in.setAction("NOW");
    sendBroadcast(in);
  ...

Code d'activité principal

    public class MainActivity extends Activity implements SensorEventListener, Listen {

        private BroadcastReceiver statusReceiver;
        private IntentFilter mIntent;


    Sensor accelerometer;
    SensorManager sm;
    TextView acceleration;
    SendValues sv;
    int counter3 = 0;
    int counter5 = 0;

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

         mIntent = new IntentFilter("NOW");

      // this.registerReceiver(,new IntentFilter("status"));

        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        sm.registerListener(this,accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        acceleration = (TextView) findViewById(R.id.sensorTxt);

        statusReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                String type = intent.getStringExtra("message");  //get the type of message from MyGcmListenerService 1 - lock or 0 -Unlock
                sm = (SensorManager) getSystemService(SENSOR_SERVICE);
                accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                Log.d(TAG, "Status: " + type);
                if (type == "1") // 1 == lock
                {
                    Toast.makeText(getApplication(), "Lock", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplication(), "UNLOCK", Toast.LENGTH_LONG).show();
                }
            }

        };
    }

        @Override
         protected void onResume()
         {
            super.onResume();
            registerReceiver(statusReceiver,mIntent);
          }

    @Override
    protected void onPause() {
        if(mIntent != null) {
            unregisterReceiver(statusReceiver);
            mIntent = null;
        }
        super.onPause();
    }


----------

Eh bien, je ne sais pas ce que je fais mal, et une autre question, que dois-je mettre dans le

Dans l'ensemble Action ("Je peux mettre ici n'importe quelle chaîne/action que je veux? Et qu'est-ce que cela signifie? Je veux juste envoyer une chaîne à l'activité principale, quelle action dois-je faire"?)

13
Bolandian Eran

LocalBroadcastManager est la meilleure solution pour résoudre ce type de problème. J'ai implémenté LocalBroadcastManager à votre existant. C'est très facile. J'espère que cela fonctionnera. Votre code ressemblera à ceci

private BroadcastReceiver statusReceiver;
private IntentFilter mIntent;
Sensor accelerometer;
SensorManager sm;
TextView acceleration;
SendValues sv;
int counter3 = 0;
int counter5 = 0;

private static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     //mIntent = new IntentFilter("NOW");

  // this.registerReceiver(,new IntentFilter("status"));

    sm = (SensorManager) getSystemService(SENSOR_SERVICE);
    sm.registerListener(this,accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    acceleration = (TextView) findViewById(R.id.sensorTxt);

}

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String type = intent.getStringExtra("message");  //get the type of message from MyGcmListenerService 1 - lock or 0 -Unlock
        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        Log.d(TAG, "Status: " + type);
        if (type == "1") // 1 == lock
        {
            Toast.makeText(getApplication(), "Lock", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplication(), "UNLOCK", Toast.LENGTH_LONG).show();
        }
    }
};

@Override
 protected void onResume()
 {
    super.onResume();
    //registerReceiver(statusReceiver,mIntent);
    LocalBroadcastManager.getInstance(MainActivity.this).registerReceiver(broadcastReceiver, new IntentFilter("NOW"));
  }

@Override
protected void onPause() {
    if(mIntent != null) {
        unregisterReceiver(statusReceiver);
        mIntent = null;
    }
    super.onPause();
}

Et transmettez votre valeur de la notification push quelque chose comme ça

Intent in = new Intent();
in.putExtra("TYPE",typemessage);
in.setAction("NOW");
//sendBroadcast(in);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(in);
8
Masum

vous pouvez utiliser LocalBroadcastManager pour obtenir ce que vous voulez. comme dans votre service appelez cette méthode lorsque vous voulez envoyer les données.

private static void sendMessageToActivity(String msg) {
Intent intent = new Intent("intentKey");
// You can also include some extra data.
intent.putExtra("key", msg);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}

Dans votre activité, enregistrez un Receiver dans onCreate()

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
        mMessageReceiver, new IntentFilter("intentKey"));

et de onCreate() ce code.

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra("key");
    tvStatus.setText(message);
    // Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
};

j'espère que vous avez une idée.

19
Devendra Singh

vous pouvez faire 2 choses:

1. vous pouvez créer une classe et implémenter Parcelable.
2. utiliser un service d'intention au lieu du service.

Voir le lien ci-dessous: http://Android-er.blogspot.in/2013/03/send-data-from-intentservice-to.htmlhttp: //www.sanfoundry. com/Java-Android-programme-send-data-service-activity /

2
young_08