2017-08-30 151 views
0

我试图实现存档,即我的服务下载信息并在后台使用该信息填充数据库。已解决的Android:服务在应用程序启动后重新启动

SOLUTION(使用前台服务,代码现在编辑的版本)

这就是该服务:

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. 关闭应用程序(运行 - 应用 - 概述滑开)
  4. 启动应用程序之前服务已完成
  5. “服务启动” - toast显示,handleMessage()被调用,DatabaseErros发生(因为唯一的约束,但那不是重点)。

另一种情况:

  1. 开始应用
  2. 启动服务
  3. 关闭应用
  4. fillTables()(运行 - 应用 - 概述滑开)已经完成。
  5. 看来,直接 fillTables()已完成,并重新启动服务(吐司显示)。

Q1:那么,是我的错,是正在运行的服务是怎么回事,当我启动应用程序,同时正在运行的服务尚未完成重新启动吗?

Q1.1:如何在完成工作的同时调用/创建一个完全独立的服务,该服务不会以这种恼人的方式重新启动?

回答

-1

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

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

+0

>滑开应用会使其处于强制关闭状态。这会杀死附属于它的任何服务。<从我的经验来看,这不是真的。我的意思是'onStartCommand()'中返回START_REDELIVER_INTENT;'的意思,而不是在应用程序关闭时终止服务。 >但是没有任何东西会让它在被移除后运行服务。<...那不是我要求的 – Nico

+0

不,start_redeliver_intent的要点是如果操作系统停止它,则重新启动它,而不是如果用户停止它。在用户关闭应用程序后,您无法重新启动或继续运行。 –

+0

再次。当用户关闭应用程序时,该服务不会停止。当服务当前正在运行并且用户再次启动应用程序时,服务会再次启动,该应用程序之前已关闭。 – Nico

相关问题