【发布时间】:2015-09-29 20:27:56
【问题描述】:
我有一个BluetoothSocket mmSocket; 在我的主要活动的公开声明中。
在函数中,我为一个变量赋值,如果连接,我启动一个线程。
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mConnectedThread = new ConnectedThread(mmSocket);
mConnectedThread.start();
我的代码运行正常。
但是,当我在菜单中启动另一个活动时,如果我在不到 5 秒的时间内返回到主要活动,则线程正常,并且 mi 应用程序从 BT 读取正常。但是,如果当我返回主活动时,我在活动 B 中停留的时间超过 10 秒,则变量 mmSocket 为空,并且我的线程被终止。
Intent i = new Intent(getApplicationContext(), AjustesActivity.class);
i.putExtra("distancia", Math.floor(MetrosRecorridos / 10));
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(i, 3);
有什么办法吗?
编辑(2015 年 7 月 14 日)
在我的服务类中,我有:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//In this part i connected whith Bluetooth.
new Handler().post(new Runnable() {
@Override
public void run() {
byte[] buffer = new byte[2500];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
String readMessage = new String(buffer, 0, bytes);
sendMessage(readMessage);
} catch (IOException e) { }
}
});
}
private void sendMessage(String Msg) {
Intent intent = new Intent("custom-event-name");
intent.putExtra("message", Msg);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
在我的主要活动中:
@Override
public void onCreate(Bundle savedInstanceState) {
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("custom-event-name"));
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
}
};
当我调试主要活动时,没有收到消息。有什么想法吗?
谢谢
【问题讨论】:
-
只需删除
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);,因为它在活动上创建了一个实例,并且它不适用于startActivityForResult -
使用 onSaveInstanceState (developer.android.com/reference/android/app/…, android.os.PersistableBundle) 来保存你需要的变量怎么样?然后,当重新创建活动时,您可以再次检索它。但是,如果您需要一个应该持久的线程,您可以使用服务 (developer.android.com/guide/components/services.html)
-
你是如何假设你的线程被杀死的?线程不绑定到活动 - 你可能只失去对它的引用。线程只能通过调用 stop() 方法或完成 run() 方法来停止。请显示您的堆栈转储
标签: java android android-intent android-activity bluetooth