如果应用程序位于广播接收器的前台,则更改UI元素

时间:2012-03-07 22:53:10

标签: android broadcastreceiver foreground

我设置了BroadcastReceiver根据电源状态打开和关闭蓝牙(插入时,蓝牙已打开,已拔下插头,蓝牙已关闭)。这工作得很好(耶!)。但是,我的非常简单的应用程序只有一个按钮,它也会打开和关闭蓝牙,并且文本“蓝牙开启”或“蓝牙关闭”(如果适用)。我想更新这个按钮,但是,如果应用程序在前台,我只需要更新它。 在m,y主要活动的onResume里面,我正在调用我的updateUI方法,它检查蓝牙状态,并相应地更新按钮。但是,这仅适用于程序在后台打开并且恢复的情况,并且在插拔电源时不在程序中。

我使用此代码创建了一个新活动(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()。以一种奇怪的方式,插入手机是我的用户权限,因为这是这个应用所做的全部,所以,它不是偷偷摸摸的,因为你知道你在安装应用程序时得到了什么。

评论的内容大多是我徒劳无功的事情。

我非常愿意接受这样一个事实:我正在努力实现这一目标......

所以,正如我所说的那样,它确实能够很好地打开和关闭蓝牙,但之后就会崩溃。我无法调试它,因为模拟器没有蓝牙,我正在断开手机以获得崩溃结果,因此,它没有记录任何内容,因为它现在已连接...

我是Java和Android的新手,我会感激一点耐心。我尝试阅读官方的android文档,但这对我来说就像中文...所以,一个扩展的解释会很棒......

感谢阅读!

0 个答案:

没有答案