Android 当应用被滑动时在服务中保持变量值
Android maintain variable values in Service when app is swiped away
我的应用程序使用粘性服务在后台执行操作,即使在应用程序关闭时也是如此。
当应用被滑动时,服务不会停止(或重新启动)。但是所有变量值都会重置为初始值。即使应用程序被刷掉,我也不想保留所有变量值。这可能吗?
例子
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent test = new Intent(this, TestService.class);
startService(test);
}
}
public class TestService extends Service {
@Override
public void onCreate() {
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
Log.e("testVal: ", TestObj.test + "");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
TestObj.fillList();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
public class TestObj {
public static int test = 0;
public static void fillList() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
test = 11;
}
}
Output:
**First time app is started:**
04-24 17:51:00.234 27628-27647/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:02.235 27628-27647/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:04.235 27628-27647/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:06.236 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:08.236 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:10.237 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:12.237 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:14.237 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
**Directly after app is swiped away:**
04-24 17:51:16.447 27745-27763/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:18.492 27745-27763/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:20.534 27745-27763/com.service.test.servicetest E/testVal:﹕ 0
**5 seconds after app is swiped away:**
04-24 17:51:22.575 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:24.615 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:26.655 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:28.696 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:30.736 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
如您所见,当应用程序被滑动时,Testobj.test 的值重置为其初始值 0。五秒后,调用 fillList 方法更改 [=23] 的值=] 到 11。
理想的行为是在应用被刷掉后值保持 11。这可能吗?
系统可以随时卸载您的 class,因此 永远不要 在 Android 上使用静态变量,或者至少您应该小心使用它们。因此,您可以使用服务属性,但即使您使用前台服务,服务也可能被终止。我的建议是将该值写为共享首选项,并在服务重新启动时从那里获取它。
我的应用程序使用粘性服务在后台执行操作,即使在应用程序关闭时也是如此。
当应用被滑动时,服务不会停止(或重新启动)。但是所有变量值都会重置为初始值。即使应用程序被刷掉,我也不想保留所有变量值。这可能吗?
例子
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent test = new Intent(this, TestService.class);
startService(test);
}
}
public class TestService extends Service {
@Override
public void onCreate() {
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
Log.e("testVal: ", TestObj.test + "");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
TestObj.fillList();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
public class TestObj {
public static int test = 0;
public static void fillList() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
test = 11;
}
}
Output:
**First time app is started:**
04-24 17:51:00.234 27628-27647/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:02.235 27628-27647/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:04.235 27628-27647/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:06.236 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:08.236 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:10.237 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:12.237 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:14.237 27628-27647/com.service.test.servicetest E/testVal:﹕ 11
**Directly after app is swiped away:**
04-24 17:51:16.447 27745-27763/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:18.492 27745-27763/com.service.test.servicetest E/testVal:﹕ 0
04-24 17:51:20.534 27745-27763/com.service.test.servicetest E/testVal:﹕ 0
**5 seconds after app is swiped away:**
04-24 17:51:22.575 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:24.615 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:26.655 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:28.696 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
04-24 17:51:30.736 27745-27763/com.service.test.servicetest E/testVal:﹕ 11
如您所见,当应用程序被滑动时,Testobj.test 的值重置为其初始值 0。五秒后,调用 fillList 方法更改 [=23] 的值=] 到 11。
理想的行为是在应用被刷掉后值保持 11。这可能吗?
系统可以随时卸载您的 class,因此 永远不要 在 Android 上使用静态变量,或者至少您应该小心使用它们。因此,您可以使用服务属性,但即使您使用前台服务,服务也可能被终止。我的建议是将该值写为共享首选项,并在服务重新启动时从那里获取它。