Android 从另一个服务启动服务并传递值

Android 从另一个服务启动服务并传递值,android,service,pass-by-value,Android,Service,Pass By Value,我的Android应用程序中有一项服务。在onStart命令期间,我将服务对象传递给另一个类。然后,有一个线程在30秒后启动另一个服务。是这样的: public class FooService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Inte

我的Android应用程序中有一项服务。在onStart命令期间,我将服务对象传递给另一个类。然后,有一个线程在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()来销毁该服务对象。顺便说一句,MyClass获得了该服务的一个副本,该副本是通过值传递的。20秒后,我们可以从MyClass启动BarService。我已经测试过了,但我不明白为什么!(对我来说)我写代码的方式是肮脏的。从一个被破坏的服务启动另一个服务是否正确?谢谢你的帮助

我已经测试过了,但我不明白为什么

它现在可以在您测试的环境中工作。它可能无法在所有环境中工作(例如ROM mods),也可能无法在明天工作(例如Android操作系统更新)。已销毁的
上下文
,例如您停止的服务,不应用于任何用途。现在您仍然可以使用它在以后调用
startService()
,但这种行为不能保证

从一个被破坏的服务启动另一个服务是否正确

不。在这种情况下,我不明白为什么您首先需要两种服务

我有这项服务的副本


不,您没有。

参考文献保留。很正常。您应该使用AlarmManager来进行此操作。@sayier它不是引用(或指针,或其他)。Java是按值传递的,这意味着对象本身被销毁,但我已经得到了该服务的一个副本,即使它没有处于启动状态。这是一个理论问题:从我使用stopSelf()破坏的服务启动另一个服务是否正确?我已经实现了AlarmManager,但现在,我每次都在更新MyClass中的服务对象。将Handler与Messenger一起使用,并通过活动不断更新您的服务。Java不是一个传递值,我的意思是,是的,但它不是那么简单。和stopSelf()被摧毁的物体。依我看,从停止的服务开始另一个服务不是一个好主意。工作是因为您的服务已停止但仍然存在。因此,在这一点上,我认为我返回并混淆了按引用传递、按值传递…@Angelo:简而言之,
MyClass
构造函数中的
service
是指向
service
对象的指针。该指针将从其原始位置复制(按值传递)(
在您的服务中)。底层对象没有被复制。我读了太多次那个该死的链接:所以,通过值传递意味着指针被复制,而不是对象本身。好的因此,即使我调用stopSelf()(正如占卜者所指出的)服务对象没有被销毁,我仍然在MyClass中有一个引用,GC也不会销毁它。。。但它在Android环境中不可用。它仍然有效,只是因为对象在我的堆栈中的某个地方,对吗?@Angelo:你仍然可以在服务中使用它。在
onStartCommand()
中使用
if
语句,根据
Intent
@Angelo中的额外语句进行分支:如果
MyClass
的实例仅由一个
服务使用,请使用
服务。如果
MyClass
的实例可能被多个组件使用(例如,它是一个单实例),请使用
getApplication()
检索
应用程序并使用它,以避免内存泄漏。