【发布时间】:2014-04-16 09:53:28
【问题描述】:
我的 Android 应用程序中有一个服务。在 onStartCommand 期间,我将 Service 对象传递给另一个类。然后,从那里,有一个线程在 30 秒后启动另一个服务。是这样的:
public class FooService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
MyClass mc = new MyClass(this);
mc.testMethod();
stopSelf();
return START_NOT_STICKY;
}
}
这是我的班级:
public class MyClass {
private Service service;
public MyClass(Service service) {
this.service = service;
}
public void testMethod() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(20*1000);
Intent intent = new Intent(service, BarService.class);
service.startService(intent);
}
catch (Exception e) {
// CATCH!
}
}
}).start();
}
}
现在,如您所见,在 FooService 中,我调用 stopSelf() 来破坏该 Service 对象。顺便说一句,MyClass 获得了按值传递的该服务的副本。 20 秒后,我们可以从 MyClass 启动 BarService。我已经测试过它并且它有效,但我不明白为什么!我编写代码的方式很脏(对我来说)。从被破坏的服务启动另一项服务是否正确?感谢您的帮助。
【问题讨论】:
-
参考保存。只是正常。您应该为此使用 AlarmManager。
-
@SoothSayer 它不是引用(或指针,或其他)。 Java 是按值传递的,这意味着对象本身已被销毁,但即使它未处于启动状态,我也有该服务的 副本。这是一个理论问题:从我使用 stopSelf() 销毁的服务启动另一个服务是否正确?我已经实现了一个 AlarmManager,但是现在,我每次都在更新 MyClass 中的 Service 对象。
-
使用 Handler 和 Messenger 并通过活动不断更新您的服务。
-
Java 不是价值传递,我的意思是,是的,但它不是那么简单。并且 stopSelf() != 被破坏的对象。 IMO,从停止的服务启动另一个服务不是一个好主意。有效,因为您的服务已停止但仍然存在。
标签: android service pass-by-value