изменение элементов интерфейса, если приложение находится на переднем плане от приемника вещания - PullRequest
0 голосов
/ 08 марта 2012

У меня есть BroadcastReceiver, настроенный для включения и выключения Bluetooth в соответствии с состоянием питания (при подключении Bluetooth включен, отключен, Bluetooth выключен). Это работает просто отлично (ууу!). однако, мое очень простое приложение имеет одну кнопку, которая также включает и выключает Bluetooth, и имеет текст «Bluetooth включен» или «Bluetooth выключен», в зависимости от обстоятельств. Я хотел бы обновить эту единственную кнопку, НО, я должен обновлять ее, только если приложение находится на переднем плане. Внутри onResume на m, y основной активности я вызываю мой метод updateUI, который проверяет состояние Bluetooth и соответственно обновляет кнопку. однако это применимо только в том случае, если программа была открыта и работала в фоновом режиме и возобновляется, НЕ, если я нахожусь в программе во время подключения / отключения питания.

Я создал новое действие (CheckIfAppIsRunningActivity.java) с этим кодом, который должен проверять, работает ли мое приложение на переднем плане, и, если это так, перевести его в действие (BluetoothOnActivity), которое обновит кнопку:

       package vermel.BluetoothOn;
       import java.util.List;
       import android.app.Activity;
       import android.app.ActivityManager;
       import android.app.ActivityManager.RunningAppProcessInfo;
       import android.content.BroadcastReceiver;
       import android.content.Context;
       import android.content.Intent;
       import android.widget.Toast;

       public class CheckIfAppIsRunningActivity extends Activity{

       public void onCreate() {
    checkStatus();
   } 

        private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    Intent it = new Intent();
        it.setClassName("vermel.BluetoothOn", "vermel.BluetoothOn.BluetoothOnActivity");
        context.startActivity(it);
    }
};
public void checkStatus() {
    ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> runningProcInfo = activityManager.getRunningAppProcesses();

    for(int i = 0; i < runningProcInfo.size(); i++){
            if(runningProcInfo.get(i).processName.equals("vermel.BluetoothOn")) {
                if (runningProcInfo.get(i).lru == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
                    //start activity
                    /* Intent it = new Intent();
                    it.setClassName("vermel.BluetoothOn", "vermel.BluetoothOn.BluetoothOnActivity");
                    context.startActivity(it); */

            }
            }
    }
}
}

и я указываю на это с моего приемника вещания:

    package vermel.BluetoothOn;

    import android.bluetooth.BluetoothAdapter;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Button;
    import android.widget.Toast;

    public class BTDetector extends BroadcastReceiver {

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

public void onReceive(Context context , Intent intent) {


    String action = intent.getAction();

    if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
         if (!mBluetoothAdapter.isEnabled()) {
            mBluetoothAdapter.enable();
            //TODO if app is open, change text on button to on
            //Toast.makeText(context, "turned on bluetooth", Toast.LENGTH_LONG).show();
             Intent i = new Intent();
            i.setClassName("vermel.BluetoothOn", "vermel.BluetoothOn.CheckIfAppIsRunningActivity");
            context.startActivity(i); 
        }


    } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
        if (mBluetoothAdapter.isEnabled()){
            mBluetoothAdapter.disable();
            //TODO if app is open, change text on button to off
            //Toast.makeText(context, "turned off bluetooth", Toast.LENGTH_LONG).show();

            Intent i = new Intent();
            i.setClassName("vermel.BluetoothOn", "vermel.BluetoothOn.CheckIfAppIsRunningActivity");
            context.startActivity(i); 
        }

    }
}
 }

несколько вещей: да, я знаю, что я не должен использовать .enable () без разрешения пользователя. странным образом, подключение телефона - это мое разрешение пользователя, так как это ВСЕ, что делает это приложение, поэтому оно не подлое, так как вы знаете, что получаете, когда устанавливаете приложение.

Прокомментированные вещи - это, в основном, вещи, которые я пробовал напрасно ..

Я очень открыт тому факту, что я делаю этот ПУТЬ сложнее, чем мне нужно ...

так что, как я уже сказал, он прекрасно включает и выключает Bluetooth, но просто вылетает после этого. Я не могу отладить его, так как в эмуляторе нет Bluetooth, и я отключаю телефон, чтобы получить результат сбоя, поэтому он ничего не регистрирует, так как теперь он подключен ...

Я новичок в Java и Android, и был бы признателен за терпение. Я пытаюсь прочитать официальную документацию по Android, но для меня это похоже на китайский ... так что подробное объяснение было бы здорово ...

Спасибо за чтение!

...