サービスからメインアクティビティにブロードキャストで文字列を送信しようとしています。ブロードキャストを使用するには2つの方法があることをいくつかのフォーラムで読みました。 1つはマニフェストにアクティビティを登録する方法で、もう1つはローカルのアクティビティで行う方法です。 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();
}
----------
まあ、私は何が間違っているのかわかりません、そして別の質問、何を入れなければならないのですか?
Set Action( "ここに私は何でもできる文字列/アクションを置くことができますか?そしてそれはアクションを意味しますか?文字列をメインアクティビティに送信したいだけです、私は何をすべきですか?")
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
を使用して、目的の結果を得ることができます。データを送信する場合は、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();
}
};
_
あなたがアイデアを得たことを願っています。
あなたは2つのことをすることができます:
1。クラスを作成してParcelableを実装できます。
2。 Serviceの代わりにIntentサービスを使用します
以下のリンクを参照してください: http://Android-er.blogspot.in/2013/03/send-data-from-intentservice-to.htmlhttp://www.sanfoundry。 com/Java-Android-program-send-data-service-activity /