我设置了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文档,但这对我来说就像中文...所以,一个扩展的解释会很棒......
感谢阅读!