Android:应用启动后服务重新启动

时间:2017-08-30 15:55:24

标签: android service background restart foreground

我试图实现,我的服务下载信息并在后台填写包含该信息的数据库。

解决方案(使用前台服务,代码现在是编辑版本)

这项服务:

public class UnitPullService extends Service {
    private final static String name = UnitPullService.class.getSimpleName();
    public static Boolean isRunning = false;
    private Looper mServiceLooper;
    private ServiceHandler mServiceHandler;

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            try {
                UnitDataSource unitdataSource = new UnitDataSource(getApplicationContext());
                unitdataSource.fillTables();
                SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                SharedPreferences.Editor spEitor = sharedPreferences.edit();
                // disables the button which starts this service
                spEitor.putBoolean("isFilled", true);
                spEitor.commit();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            stopSelf(msg.arg1);
        }
    }

    @Override
    public void onCreate() {
        HandlerThread thread = new HandlerThread("ServiceStartArguments",
            Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // PART OF THE SOLUTION
        startForeground(1000, new Notification());

        Toast.makeText(this, "service starting", 
           Toast.LENGTH_SHORT).show();
        // to check if the service is currently running
        isRunning = true;
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        mServiceHandler.sendMessage(msg);

        return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
    }
}

这就是活动中的意图(实际上来自片段):

 Intent i= new Intent(getContext(), UnitPullService.class);
 getContext().startService(i);

在清单中,服务声明为:

<service
  android:name=".UnitPullService"
  android:exported="false"/>

关键是,我想整个“下载和数据库填充” - 完全独立于启动服务的应用程序的状态(以便用户可以在服务执行时使用其他应用程序作业)。

编辑(做出错误的假设)

以下表现得很奇怪:

  1. 启动申请
  2. 开始服务
  3. 关闭应用程序(轻扫远离running-apps-overview)
  4. 在服务完成之前启动应用
  5. “服务启动”-toast显示,handleMessage()被调用并且DatabaseErros发生(因为有独特的约束,但这不是重点)。
  6. 另一种情况:

    1. 启动申请
    2. 开始服务
    3. 关闭应用程序(轻扫远离running-apps-overview)
    4. fillTables()已完成。
    5. 似乎直接 fillTables()已完成且服务重新启动(Toast显示)。
    6. Q1:那么我的错在哪里,当我正在运行的服务尚未完成时启动应用程序时,正在运行的服务将重新启动?

      Q1.1 :我如何调用/创建一个完全独立的服务,在执行其工作时不会以这种厌恶的方式重新启动?

1 个答案:

答案 0 :(得分:-1)

轻扫应用程序会将其置于强制关闭状态。这会杀死附加到它的任何服务。在用户启动之前,它不允许应用程序中的服务或任何其他活动再次运行。

现在,如果用户没有滑动,无论前台有什么应用,您的服务都将继续运行。如果该服务被操作系统杀死,您可以在它们可用时自动重启。但是没有任何东西可以让它在被刷掉之后运行服务。