开始另一个活动时不破坏主要活动

问题描述:

我有一个BluetoothSocket mmSocket;在我的主要活动的公共cass中声明。开始另一个活动时不破坏主要活动

在i的函数ASIGN值的变量,如果连接的I启动一个线程。

UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 
    mmSocket.connect(); 
    mConnectedThread = new ConnectedThread(mmSocket); 
    mConnectedThread.start(); 

我的代码运行正常。

但是,当我在菜单中启动另一个活动,如果我在不到5秒的主活动返回线程是从BT OK OK(确定)和MI应用。但是如果当我回到主要活动的时候,我更多的停留在活动B的10秒内,那么变量mmSocket就是null,我的线程被杀死。

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); 

任何解决方案?

EDIT(05/08/2015)

在我的服务类,我有:

@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); 
} 

,并在我的mainactivity:

@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"); 
} 
}; 

当我调试的主要胡亚蓉没有收到消息。任何想法?

谢谢

+0

只是删除'i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);'作为其作出一个实例上的活动和不'startActivityForResult' –

+0

工作怎么样的onSaveInstanceState使用 (HTTP://开发商。 android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle,android.os.PersistableBundle))来保存你需要的变量?然后,当活动重新创建时,您可以再次检索它。但是,如果您需要一个应该保持的线程,则可以使用服务(http://developer.android.com/guide/components/services。HTML) –

+0

你如何认为你的线程被杀害?线程没有被绑定到活动 - 你可能只会失去对它的引用。线程只能通过stop()方法或finish run()方法停止。请认准你的堆栈转储 – ceph3us

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

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

清单:

<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; 
    } 
} 

EDIT(05/08/2015)

在我的服务类,我有:

@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"); 
} 
}; 

当我调试主要活动没有收到邮件。任何想法?

感谢

+0

谢谢!我将尝试使用此代码...我有一个问题...当我与bluettoth进行连接时?在onCreate()服务内?谢谢 –

+0

@r_ameijeiras初始化它,在onCreate()中添加监听器,params,开始扫描onStartCommand() –

+0

啊!好!添加onStartCommand中连接的代码和读取处理程序run()中数据的代码,否? THanks –