每当我的应用程序被最小化时,我启动一个服务,即向我的HTTP服务器发送拉取请求以检查通知,当应用程序恢复时,服务被终止(以及计划的可运行)。一切正常,直到我决定杀死应用程序(将其从正在运行的应用程序列表中滑出屏幕)。然后由于某种原因,服务的属性被重置(即使是静态的),onStartCommand
再次被调用,它的第一个参数Intent
为null
,这对我来说很奇怪。
以下是代码的一些部分
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
继续运行,但cookieString
和userAgent
成为默认值。
我需要能够在活动被破坏时保留这些值,我该怎么做?
我在Android和java开发方面都没有经验,如果我的代码让任何人哭泣,我想道歉。
以下是该服务的清单条目,它位于<application
<service android:name=".PullService" android:exported="false"/>
答案 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);
}