没有活动的后台服务

时间:2013-10-24 15:01:11

标签: service android-activity swipe kill

我正在尝试创建一个使用后台服务连接到BluetoothDevice的应用程序:

的活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);


    /* ... Create Data Scruct ...*/
    dataStruct = new DataStruct();

    /* Start Service /*
    Intent intentService = new Intent(this,NewService.class);
    intentService.putExtra("Data", dataStruct);
    startService(intentService);


}

服务:

public class NewService extends Service{
@Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      super.onStartCommand(intent, flags, startId); 
dataStruct = intent.getStringExtra("Data");
...
connectBluetooth(dataStruct.getDeviceBT());
return START_NOT_STICKY;
}

public void BTReceive(){
updateDataStruct();
}
}

每次BT连接并收到特殊的通知发生 单击通知时,活动开始(按意图) 它有效,但我想在没有启动Activity布局的情况下启动此应用程序。我想开始服务并在Startup of mobile上启动它。 最后一个问题,当我从“最后一个应用程序列表”中删除应用程序服务停止并且蓝牙通信丢失。 有办法避免它吗? 我想杀死活动但保持活力

谢谢

1 个答案:

答案 0 :(得分:1)

*)我想开始只是服务并在Startup of mobile上启动它。?

答案:请使用以下代码在启动时启动服务。

<receiver
        android:name="com.xxx.CustomBroadcastReciever"
        android:enabled="true" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

使用广播接收器在启动或启动完成后接收意图,然后从那里开始服务。

*)当我从“最后一个应用程序列表”中清除应用程序时服务停止并且蓝牙通信丢失。有办法避免它吗?

答案:使用AlarmManager来避免它。使用重复警报运行5到10秒,从那里你可以调用BroadCastReceiver。所以现在BroadCastReceiver被称为非常5-10秒。检查服务是否仍在运行,否则在BroadCastReceiver中启动它。

Intent intent = new Intent(this, CustomBroadcastReciever.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
            intent, PendingIntent.FLAG_CANCEL_CURRENT);

        // InexactRepeating allows Android to optimize the energy
        // consumption
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis(), (5 * 1000), pendingIntent);