Служба убивается после убийства приложения

ОБНОВЛЕНИЕ У меня есть действие, в котором я запускаю службу, которая успешно работает. Я пытаюсь сохранить подключение Bluetooth в службе. Bluetooth-соединение успешно работает через службу, когда приложение активно. Но когда я закрываю приложение, которое я обслуживаю, также убивается, и связь Bluetooth теряется. Ниже приведен мой код активности.

http://www.vogella.com/tutorials/AndroidServices/article.html

@Override
protected void onResume() {
    super.onResume();
    if (bluetoothService == null) {
        kolamDeviceDialog();
    } else {
        Log.e("MenuBluetoothService",bluetoothService.getStatus()+"");
        if (!bluetoothService.getStatus()) {
            kolamDeviceDialog();
        }
    }

}

private void kolamDeviceDialog() {
    MaterialDialog.Builder builder = new MaterialDialog.Builder(MenuActivity.this)
            .title("Select Bot")
            .items(scanTypes)
            .itemsCallback(new MaterialDialog.ListCallback() {
                @Override
                public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) {
                    if (position == 0) {
                        KolamDevice kolamDevice = new KolamDevice();
                        Intent intent = new Intent(MenuActivity.this, BluetoothService.class);
                        intent.putExtra("Address", kolamDevice.getBigBotAddress());
                        intent.putExtra("Name", kolamDevice.getBigBotName());
                        startService(intent);
                        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
                    } else {
                        KolamDevice kolamDevice = new KolamDevice();
                        Intent intent = new Intent(MenuActivity.this, BluetoothService.class);
                        intent.putExtra("Address", kolamDevice.getSmallBotAddress());
                        intent.putExtra("Name", kolamDevice.getSmallBotName());
                        startService(intent);
                        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
                    }
                }
            });
    builder.show();
}

@Override
protected void onPause() {
    super.onPause();
   // unbindService(mConnection);
}

private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className,
                                   IBinder binder) {
        BluetoothService.MyBinder b = (BluetoothService.MyBinder) binder;
        bluetoothService = b.getService();
        Toast.makeText(MenuActivity.this, "Connected", Toast.LENGTH_SHORT)
                .show();
    }

    public void onServiceDisconnected(ComponentName className) {
        bluetoothService = null;
    }
};

Это мой файл манифеста.

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:name=".AppController"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity" />
    <activity android:name=".ARCameraActivity" />
    <activity android:name=".RegistrationActivity" />
    <activity android:name=".LoginActivity" />
    <activity android:name=".SplashActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".MenuActivity" />
    <activity android:name=".ScanAndDrawActivity" />
    <activity android:name=".GalleryActivity" />
    <activity android:name=".PdfKolamActivity" />

    <service
        android:enabled="true"
        android:name=".BluetoothService">
        <intent-filter>
            <action android:name="com.ignite.a01hw909350.kolamdemo.BluetoothService"/>
        </intent-filter>
    </service>

    <receiver
        android:name=".MyScheduleReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <receiver
        android:name=".MyStartServiceReceiver"/>
</application>

Наконец-то это мой класс обслуживания.

public class BluetoothService extends Service {

private final IBinder mBinder = new MyBinder();
private SmoothBluetooth smoothBluetooth;
private static Device device;
private boolean isConnected = false;
String address, name;
private List<Integer> mBuffer = new ArrayList<>();
private List<String> mResponseBuffer = new ArrayList<>();

public BluetoothService() {
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e("BluetoothService", "Started");
    Bundle extras = intent.getExtras();
    if (extras != null) {
        address = extras.getString("Address");
        name = extras.getString("Name");
    }
    smoothBluetooth = new SmoothBluetooth(this);
    smoothBluetooth.setListener(mListener);

    if (smoothBluetooth.isBluetoothEnabled()) {
        if (!smoothBluetooth.isConnected()) {
            device = new Device(name, address, true);
            smoothBluetooth.tryConnection();
        }
    }
    return Service.START_NOT_STICKY;
}


@Override
public IBinder onBind(Intent arg0) {
    return mBinder;
}

public class MyBinder extends Binder {
    BluetoothService getService() {
        return BluetoothService.this;
    }
}

public boolean getStatus() {
    return isConnected;
}

Это Receiver, в котором я явно вызываю startService().

public class MyStartServiceReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent service = new Intent(context, BluetoothService.class);
    context.startService(service);
}

}

Пожалуйста, скажите мне, что не так в моем коде.


person Community    schedule 23.03.2017    source источник
comment
что возвращает bindService?   -  person pskink    schedule 23.03.2017
comment
В методе onServiceConnected() его сообщение подключено, но привязка не происходит   -  person    schedule 23.03.2017
comment
поэтому, если onServiceConnected называется, ваша служба связана с вашей деятельностью... что вы подразумеваете под "but the bind is not happening"?   -  person pskink    schedule 23.03.2017
comment
Я сохранил журнал внутри onStartCommand в службе. Но он не показывает журнал. Что делать?   -  person    schedule 23.03.2017
comment
onStartCommand используется запущенными Службами (когда вы вызываете метод startService()). noreferrer">developer.android.com/guide/components/bound-services.html   -  person pskink    schedule 23.03.2017
comment
Пожалуйста, смотрите мой обновленный вопрос. Я могу создать службу, но метод onStartCommand не вызывается. Что случилось ?   -  person    schedule 23.03.2017
comment
потому что ты не позвонил startService? я уже говорил, что "onStartCommand is used by "started" Services (when you call startService() method)"   -  person pskink    schedule 23.03.2017
comment
Как я могу запустить onStartCommand после onCreate(). Любые решения?   -  person    schedule 23.03.2017
comment
вы читали официальную документацию по Service#onStartCommand? если да, то для чего используется этот метод?   -  person pskink    schedule 23.03.2017
comment
Смотрите, я создал приемник, где я явно вызвал startService(). Ниже приведена ссылка, которую я использовал для создания сервиса. vogella.com/tutorials/AndroidServices/article.html Я не могу выяснить, где вызывать startService().   -  person    schedule 23.03.2017
comment
я не вижу ни одного вызова метода startService()   -  person pskink    schedule 23.03.2017
comment
пожалуйста, смотрите мой обновленный вопрос.   -  person    schedule 23.03.2017
comment
что возвращает context.startService()?   -  person pskink    schedule 23.03.2017
comment
Я могу успешно запустить службу, и подключение Bluetooth происходит через службу. Но когда я закрываю свое приложение, служба также останавливается, потому что я теряю соединение Bluetooth, когда закрываю свое приложение.   -  person    schedule 24.03.2017


Ответы (1)


Не привязывайте свою службу к своей деятельности, вместо этого используйте запущенную службу. https://developer.android.com/guide/components/services.html

person ak0692    schedule 24.03.2017
comment
Мне нужно привязать, чтобы я мог обмениваться данными между действиями и услугами и наоборот. - person ; 25.03.2017
comment
Затем создайте службу, которая запускается и привязывается одновременно. - person ak0692; 27.03.2017
comment
Да сделал это. Я заработал, добавив startForeground() в любом случае, спасибо за помощь. - person ; 27.03.2017