Как снова запустить службу после того, как приложение было свернуто, а затем снова открыто? - PullRequest
0 голосов
/ 24 октября 2018

У меня проблема с сервисом в андроиде.он работает нормально, когда приложение запущено, но если приложение свернуто и служба уничтожена, я не могу запустить службу снова, когда я снова открываю приложение.активность:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    //Activates the custom toolbar
    setSupportActionBar(toolbar);

    ActionBarDrawerToggle navigationDrawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(navigationDrawerToggle);
    navigationDrawerToggle.syncState();

    //Checks first item in the navigation drawer initially
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setCheckedItem(R.id.fragment_camera);

    //Open camera fragment initially when the app starts.
    if (savedInstanceState == null) {
        fragmentInterface = new FotoapparatFragment();
        replaceFragment(fragmentInterface);
    }

    setupConnectionToService();

    Intent backgroundReceiptService = new Intent(this, ReceiptService.class);
    startService(backgroundReceiptService);
}

@Override
protected void onStart() {
    super.onStart();
    Intent intent = new Intent(this, ReceiptService.class);
    bindService(intent, receiptConnection, Context.BIND_AUTO_CREATE);
    Log.d(MAIN_LOG, "Binded With ReceiptService");
}

Вот команда onStartCommand в сервисе:

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

    receiptDatabase = ReceiptDatabase.getInstance(getApplicationContext());

    //Checks if the permission to use external storage on the phone has been granted
    if (PermissionUtil.checkPermission(getApplicationContext(), PermissionUtil.Permissions.EXTERNAL_READ) == PackageManager.PERMISSION_GRANTED) {
        callLatestReceiptData(null);
        initializeFileObserver();
        listInitialized = true;
    }

    //TODO: Needs to moved elsewhere, but are not sure where
    new Thread(new Runnable() {
        @Override
        public void run() {
            Period period = new Period();
            period.setMPeriodId(1);
            receiptDatabase.daoAccessPeriod().insertNewPeriod(period);
        }
    }).start();

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

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

ОК. Итак, в вашем классе Service вам нужно переопределить onStartCommand () и вернуть флаг START_STICKY. Это должно перезапустить ваш сервис.Для получения дополнительной информации посетите страницу разработчиков Android по этой теме Услуги.

 @Override
 public int onStartCommand(Intent intent,int flags, int startId){
    return super.onStartCommand(intent,0,START_STICKY);

}
0 голосов
/ 24 октября 2018

Я думаю, вы хотите запустить сервис из фона, верно?Я использовал этот метод для выполнения моих требований к отслеживанию.

Вы можете использовать BroadcastReceiver вместе с Сервисом .Использование return Service.START_STICKY на onStartCommand вservice.

В onDestroy или в onTaskRemoved вы можете записать отправку и начать прием трансляции, как показано ниже [in kotlin].

override fun onTaskRemoved(rootIntent: Intent?) {
    super.onTaskRemoved(rootIntent)
    Log.e("Api service on Task Removed Send Location Service")
    if (Global.getPreference(Constant.IS_USER_LOGIN, false)!!) {
        val broadcastIntent = Intent("com.myapp.project.restartSendLocationService")
        sendBroadcast(broadcastIntent)
    }
}

И вПолучатель, вы можете начать свою службу снова, как показано ниже [в котлине].

class SendLocationReceiver : BroadcastReceiver() {

override fun onReceive(_context: Context?, intent: Intent?) {
    if (_context != null) {
        val context = _context.applicationContext
        val intentDemo = Intent(_context.applicationContext, SendLocationService::class.java)
        Log.e("Smart Sales", "UpdateLocationService \$status")
        try {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                context.startService(intentDemo)
            } else {
                context.startForegroundService(intentDemo)
            }
        } catch (e: Exception) {
            Log.e("Smart Sales", e.toString())
        }
    }
}

} ​​

Не забудьте добавить в манифест.

<receiver
        android:name=".ServiceStuff.kotlin.SendLocationReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.myapp.project.restartSendLocationService" />
        </intent-filter>
    </receiver>

Примечание:В некоторых пользовательских ОС служба не работает в фоновом режиме.

0 голосов
/ 24 октября 2018

использовать ServiceConnection.

playerIntent = new Intent(ActPlayMusic.this, MusicPlayerService.class);

                    startService(playerIntent);
                    bindService(playerIntent, mConnection, Context.BIND_AUTO_CREATE);


  private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {

            MusicPlayerService.LocalBinder binder = (MusicPlayerService.LocalBinder) service;
            try {
                playerService = binder.getServiceInstance();
                playerService.registerClient(ActPlayMusic.this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
    }
};




 @Override
    protected void onResume() {
          bindService(playerIntent, mConnection, Context.BIND_AUTO_CREATE);
        super.onResume();
    }
    @Override
    protected void onStop() {
        unbindService(mConnection);
        super.onStop();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...