销毁活动会导致服务丢失数据

时间:2015-08-05 19:19:11

标签: java android

每当我的应用程序被最小化时,我启动一个服务,即向我的HTTP服务器发送拉取请求以检查通知,当应用程序恢复时,服务被终止(以及计划的可运行)。一切正常,直到我决定杀死应用程序(将其从正在运行的应用程序列表中滑出屏幕)。然后由于某种原因,服务的属性被重置(即使是静态的),onStartCommand再次被调用,它的第一个参数Intentnull,这对我来说很奇怪。

以下是代码的一些部分

public class DnActivity extends Activity {

    protected String cookieString = "";
    protected String userAgent = "";
    protected WebView webview;

    @Override
    protected void onStop() {
        super.onStop();
        try {
            Intent mServiceIntent = new Intent(this, PullService.class);
            mServiceIntent.putExtra("cookieString", cookieString);
            mServiceIntent.putExtra("userAgent", userAgent);
            startService(mServiceIntent);
        } catch (Exception e) {
            Log.d("DNev", e.getMessage());
        }
    }

    @Override
    protected void onStart() {
        super.onStart();

        Intent mServiceIntent = new Intent(this, PullService.class);
        stopService(mServiceIntent);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        webview.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                try {
                    cookieString = getCookieFromAppCookieManager(url);
                } catch (Throwable e) {
                    Log.e("DNev", e.getMessage());
                }
            }
        });
    }
}

服务

public class PullService extends Service {

    protected static String cookieString;
    protected static String userAgent = "Mobile APP for Android";
    protected Service PullService = this;
    protected ScheduledFuture interval;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            if (intent.hasExtra("cookieString")) {
                cookieString = intent.getStringExtra("cookieString");
            }
            if (intent.hasExtra("userAgent")) {
                userAgent = intent.getStringExtra("userAgent");
            }
        }

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

    @Override
    public void onDestroy() {
        super.onDestroy();

        interval.cancel(true);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.d("DNev", String.valueOf(cookieString));
        Log.d("DNev", String.valueOf(userAgent));

        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

        interval = scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            public void run() {
                Log.d("DNev", "1");
                Log.d("DNev", String.valueOf(cookieString));
                Log.d("DNev", String.valueOf(userAgent));

                ...

正如我所说,一切正常,直到我销毁活动,然后interval继续运行,但cookieStringuserAgent成为默认值。

我需要能够在活动被破坏时保留这些值,我该怎么做?

我在Android和java开发方面都没有经验,如果我的代码让任何人哭泣,我想道歉。

以下是该服务的清单条目,它位于<application

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

2 个答案:

答案 0 :(得分:1)

  

一切正常,直到我决定杀死该应用程序(将其从正在运行的应用程序列表中滑出屏幕)。

当您从应用程序 - &gt;应用程序中删除应用程序(我假设Force Stop)时,整个应用程序将被终止,包括其服务。存储在变量中的所有内容都将随着进程而消失。如果您希望它存活,您需要将其存储在持久存储中(即在数据库或共享首选项中)。

此外,我在onStartCommand()收到此数据时保存这些数据,因为如果onDestroy()不会被调用(对于突然被杀的进程不太可能),那么您的数据将会丢失

  

我启动了一项服务,即将拉取请求发送到我的HTTP服务器以检查通知

唐&#39;吨。使用GCM实际将通知推送到应用程序。不要拉。

答案 1 :(得分:0)

DnActivity.onDestroy()方法中,将信息保存在某个地方,您可以使用&#34;关闭&#34;活动控制mServiceIntent并对其进行更改(如关闭它)

例如:

DnActivity.onDestroy(){
   super.onDestroy();
   stopService(mServiceIntent);
   Intent mServiceIntent = new Intent(this, PullService.class);
        mServiceIntent.putExtra("some_value", the_value);
        mServiceIntent.putExtra("some_other_value", the_other_value);
   startService(mServiceIntent);
}