2016-05-19 3 views
3

Im пытается отправить строку из службы в мою основную деятельность с помощью трансляции. Я прочитал на нескольких форумах, что есть 2 способа использовать трансляцию. один - зарегистрировать активность в манифесте, а второй - сделать это на активности, локально. Мне хотелось бы знать, как я могу использовать второй способ. я попытался это сделать, но, к сожалению, мне это не удалось.Отправлять строку из службы в действие

скажите, пожалуйста, что я делаю неправильно.

Сервисный

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

Основная деятельность Код

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


---------- 

Ну я не знаю, что я делаю не так, и другой вопрос, что мне нужно сделать, чтобы положить в

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' или нет? –

+0

метод не называется –

+0

проверить это http://stackoverflow.com/a/30235369/2032561 – Bharatesh

ответ

5

LocalBroadcastManager является лучшим решением для решения такого рода проблем. Я реализовал LocalBroadcastManager для вашего существующего. Это очень легко. Надеюсь, он сработает. You код будет выглядеть как этот

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

И передать свою ценность от толчок уведомления что-то вроде этого

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

вы можете сделать 2 вещи:

1. вы можете сделать класс и реализовать Parcelable.
2. используйте службу Intent вместо службы.

См ссылки ниже: 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

как использовать Intent Service? –

+0

@BolandianEran: я добавил ссылку в обновленном ответе –

+0

спасибо, я проверю его –

11

вы пользователь LocalBroadcastManager добиться того, что вы want.like в вашем service вызове этого метода, когда вы хотите отправить данные.

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

В вашей деятельности зарегистрировать Receiver в onCreate()

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

и из onCreate() этого кода.

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

Надеюсь, у вас есть идея.

+0

Импробовать ваш код прямо сейчас, я не знаю, почему, но он дает мне ошибку в «контексте» в этой строке ** LocalBroadcastManager.getInstance (контекст).sendBroadcast (намерение); ** ошибка: невозможно разрешить символ 'context' –

+2

передать 'this' в' getInstance (this) .sendBroadcast (намерение); ' –

+0

, если вы получите какую-либо проблему, дайте мне знать. –

Смежные вопросы