2016-05-19 9 views
3

Ich versuche, eine Zeichenfolge vom Dienst an meine Hauptaktivität mit Broadcast zu senden. Ich habe in ein paar Foren gelesen, dass es zwei Möglichkeiten gibt, Broadcast zu verwenden. Einer besteht darin, die Aktivität im Manifest zu registrieren, und der zweite Weg besteht darin, dies auf lokaler Ebene zu tun. Ich würde gerne wissen, wie kann ich den zweiten Weg verwenden. Ich habe versucht, es zu tun, aber leider ist es mir nicht gelungen.Sende Zeichenfolge vom Dienst an die Aktivität

Bitte sagen Sie mir, was ich falsch mache.

Servicecode

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); 

Hauptaktivitätscode

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(); 
    } 


---------- 

Nun, ich weiß nicht, was falsch im tut, und eine andere Frage, was ich brauche, zu tun in der

setzen
in.setAction("i can put here any string/action that i what? and what does it mean action? i just want to send string to the main activity, what action should i do"?) 
+0

'onReceive' Methode wird aufgerufen oder nicht? –

+0

Die Methode wird nicht aufgerufen –

+0

überprüfen Sie diese http://StackOverflow.com/A/30235369/2032561 – Bharatesh

Antwort

5

LocalBroadcastManager zur Lösung dieser Art von Problem ist die beste Lösung. Ich habe LocalBroadcastManager zu Ihrem vorhandenen implementiert. Es ist sehr leicht. Ich hoffe, es wird funktionieren. Sie Code wird wie folgt aussehen

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(); 
} 

Und Ihr Wert von Push-Benachrichtigung etwas passieren wie diese

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

Sie können 2 Dinge tun:

1. Sie können eine Klasse erstellen und Parcelable implementieren.
2. Verwenden Sie einen Intent-Dienst anstelle von Service.

Siehe Link unten: http://android-er.blogspot.in/2013/03/send-data-from-intentservice-to.html http://www.sanfoundry.com/java-android-program-send-data-service-activity/

+0

Wie verwende ich Intent Service? –

+0

@BolandianEran: Ich geteilte Link in der aktualisierten Antwort –

+0

danke, ich werde es überprüfen –

11

können Sie Benutzer LocalBroadcastManager zu erreichen, was Sie in Ihrem service Aufruf want.like diese Methode, wenn Sie möchte die Daten senden.

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); 
} 

in Ihrer Tätigkeit ein Receiver in onCreate()

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

registrieren und aus onCreate() diesen 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(); 
} 
}; 

hoffe, du hast eine Idee.

+0

Ich versuche Ihren Code jetzt, ich weiß nicht, warum, aber es gibt mir Fehler auf der "Kontext" in dieser Zeile ** LocalBroadcastManager.getInstance (Kontext).sendBroadcast (intent); ** error: kann das Symbol 'context' nicht auflösen –

+2

pass 'das' in 'getInstance (this) .sendBroadcast (intent); ' –

+0

Wenn du irgendein Problem hast, lass es mich wissen. –