2015-07-10 102 views
2

我有一個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

回答

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

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 –