【问题标题】:No destroy the main activity when start another activity启动另一个活动时不破坏主要活动
【发布时间】: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


【解决方案1】:

将您的代码放入后台服务并在单独的线程中启动它。在系统需要可用空间之前,它不会被删除。

如果您必须从服务共享数据到活动,您可以创建新接口并使用回调或创建本地广播接收器并使用捆绑发送意图。

清单:

<service
        android:name=".yourBluetoothService"
        android:exported="false"/>

服务文件:

public class yourBluetoothService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        // init code
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.v("BluetoothService", "service started");

        new Handler().post(new Runnable() {
            @Override void run() {
                //your code to start service
            }      
        }

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

编辑(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");
 }
};

当我调试主要活动时,没有收到消息。有什么想法吗?

谢谢

【讨论】:

  • 谢谢!我将尝试使用此代码...我有一个问题...当我与蓝牙建立连接时?在 onCreate() 的服务中?谢谢
  • @r_ameijeiras 初始化它,在 onCreate() 中添加监听器、参数,在 onStartCommand() 中开始扫描
  • 啊!好的!在 onStartCommand 中添加连接代码和在处理程序的 run() 中读取数据的代码,不是吗?谢谢
  • @r_ameijeiras 检查这个答案以获得更深层次的不确定性stackoverflow.com/questions/14182014/… 似乎是的,你是对的
  • 好的,代码没问题。但我不知道如何用 BluetoothService 的数据更新我的 mainactivity 文本视图。有什么解决办法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多