android - 从广播接收器更新 ui

标签 android broadcastreceiver

我有一个 MainActivity,我想在每 2 分钟调用一次 AlarmManager 后更新 UI。请帮助我如何执行此操作

这是我的主要 Activity

   public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
GPSTracker gps;
TextView lat1, long1;
Button exit, refresh;
private PendingIntent pendingIntent;
private static MainActivity mInst;
double newLat, newLong;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toolbar = (Toolbar) findViewById(R.id.app_bar);
    toolbar.setTitle("PWD_GPSFinder");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    lat1 = (TextView) findViewById(R.id.latitude);
    long1 = (TextView) findViewById(R.id.longitude);
    exit = (Button) findViewById(R.id.button);
    exit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
    refresh = (Button) findViewById(R.id.buttonRefresh);

    Intent alarmIntent = new Intent(MainActivity.this, BroadcastReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);
    startAlarm();


    refresh.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            gps = new GPSTracker(MainActivity.this);

            // check if GPS enable
            if(gps.canGetLocation()){

                double latitude = gps.getLatitude();
                double longitude = gps.getLongitude();
                lat1.setText(""+latitude);
                long1.setText(""+longitude);

            }else{
                gps.showSettingsAlert();
            }
        }
    });

    gps = new GPSTracker(MainActivity.this);

    // check if GPS enabled
    if(gps.canGetLocation()){

        double latitude = gps.getLatitude();
        double longitude = gps.getLongitude();
        lat1.setText(""+latitude);
        long1.setText(""+longitude);

    }else{

        gps.showSettingsAlert();
    }

}


public void startAlarm(){
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    /* Repeating on every 20 minutes interval */
    manager.setRepeating(AlarmManager.RTC_WAKEUP, 0,
            10 * 60 * 20, pendingIntent);
     Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}



@Override
protected void onResume() {

    super.onResume();
    // Other onResume() code here
    this.registerReceiver(mMessageReceiver, new IntentFilter("some_unique_name"));
}

@Override
protected void onPause() {
    super.onPause();
    this.unregisterReceiver(mMessageReceiver);
    // Other onPause() code here

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

        // Extract data included in the Intent
        String message = intent.getStringExtra("lat");
        String msg2 = intent.getStringExtra("long");
        updateYourActivity(context);
        lat1.setText(""+message);
        long1.setText(""+msg2);
        //update the TextView
        Toast.makeText(context, "Alarm Settttttttt", Toast.LENGTH_SHORT).show();
    }
};

private void updateYourActivity(Context context) {

    Intent intent = new Intent("some_unique_name");

    // put whatever data you want to send, if any
    // intent.putExtra("message", message);

    // send broadcast
    Toast.makeText(context, "Alarm Setdfdgdfgdfgtt", Toast.LENGTH_SHORT).show();
    newLat = gps.getLatitude();
    newLong = gps.getLongitude();
    intent.putExtra("lat", newLat);
    intent.putExtra("long", newLong);

    context.sendBroadcast(intent);


}

}

和AlarmReceiver类

 public class AlarmReceiver extends BroadcastReceiver {
GPSTracker gps;
String strDateTime;
String strDate;
FileWriter writer;
public static String username1;
File gpxfile;
File gpxfile1;
double latitude;
double longitude;

@Override
public void onReceive(Context context, Intent intent) {

    gps = new GPSTracker(context);

    // check if GPS enabled
    if(gps.canGetLocation()){

        double latitude = gps.getLatitude();
        double longitude = gps.getLongitude();
       // lat1.setText(""+latitude);
        //long1.setText(""+longitude);


    }else{
        // can't get location
        // GPS or Network is not enabled
        // Ask user to enable GPS/network in settings
        gps.showSettingsAlert();
    }
}

这里如何设置TextView的值?请帮助我。

最佳答案

从 BroadcastReciever 更新 Activity 的一种方法是在 MainActivity 中创建 BroadcastReciever:

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

    // Extract data included in the Intent
    // String message = intent.getStringExtra("message");
    //update the TextView
  }
};

在 onResume 中重新记录此 BroadcastReciever:

  this.registerReceiver(mMessageReceiver, new IntentFilter("some_unique_name"));

并在暂停时取消注册:

  this.unregisterReceiver(mMessageReceiver);

在 AlarmReceiver 中只需使用:

private void updateYourActivity(Context context) {

  Intent intent = new Intent("some_unique_name");

  // put whatever data you want to send, if any
  // intent.putExtra("message", message);

  // send broadcast
  context.sendBroadcast(intent);
}

关于android - 从广播接收器更新 ui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33389831/

相关文章:

java - 如何为一个 child 设置多个对象?

android - Intent 在接收者调用后多次调用

android - Gradle | Jacoco 任务 |测试报告

android - 将新 Intent 发送到广播接收器会提供先前 Intent 的额外值

java - 如何设置 TextView 在 Activity 中可见而不是在自定义广播接收器类中?

android - 将数据从 Activity 传递到 BroadcastReceiver

android - 在 CI 上禁用 AAPT2 守护进程

android - Mapquest - Android 应用程序的 JSON 响应不正确

android - Activity 中的 BroadcastReceiver

android - 在 AndroidManifest.xml 中注册一个本地广播接收器?