Android 将字符串从服务发送到活动

Android 将字符串从服务发送到活动,android,android-intent,broadcastreceiver,Android,Android Intent,Broadcastreceiver,我正试图通过广播将字符串从服务发送到我的主要活动。 我在一些论坛上读到有两种使用广播的方式。一种方法是在清单中注册活动,第二种方法是在本地活动上注册。 我想知道如何使用第二种方法。我已经试过了,但不幸的是我没有成功 请告诉我我做错了什么 服务代码 public class MyGcmListenerService extends GcmListenerService { private static final String TAG = "MyGcmListenerService";

我正试图通过广播将字符串从服务发送到我的主要活动。 我在一些论坛上读到有两种使用广播的方式。一种方法是在清单中注册活动,第二种方法是在本地活动上注册。 我想知道如何使用第二种方法。我已经试过了,但不幸的是我没有成功

请告诉我我做错了什么

服务代码

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


----------
主要活动代码

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


----------
我不知道我做错了什么,还有一个问题,我需要在

在set Action(“我可以在这里放置任何字符串/操作,我做了什么?它是什么意思?操作?我只想将字符串发送到主活动,我应该做什么操作?”)

您可以做两件事:

1。您可以创建类并实现Parcelable。
2.使用意向服务而不是服务。

请参阅以下链接:
LocalBroadcastManager是解决此类问题的最佳解决方案。我已将LocalBroadcastManager实现到您现有的。这很容易。希望它能起作用。您的代码将如下所示

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

您可以使用
LocalBroadcastManager
实现您想要的功能。就像在
服务中一样
在您想要发送数据时调用此方法

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);
}
在你的活动中 在
onCreate()中注册一个
接收器

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

onReceive
方法是否被调用?该方法未被调用检查我如何使用意向服务?@BolandianEran:如果我的回答有助于您解决问题,请接受回答。谢谢我希望您现在就开始尝试您的代码,我不知道为什么,但是这行LocalBroadcastManager.getInstance(context.sendBroadcast(intent))中的“context”给了我错误;错误:无法在
getInstance(this).sendBroadcast(intent)中解析符号“context”pass
this
如果您遇到任何问题,请告诉我。@DevendraSingh如果使用
方法,则无法使用。LocalBroadcastManager现在已被弃用。注销广播时出现错误,应使用:LocalBroadcastManager.getInstance(MainActivity.this)。unregisterReceiver(broadcastReceiver);