Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行流程_Java_Android - Fatal编程技术网

Java 执行流程

Java 执行流程,java,android,Java,Android,假设在我的android studio项目中有一个activity、MainActivity和一个ServiceMyService 主课 Toast.makeText(this,"Point 1",Toast.LENGTH_SHORT).show(); startService( new Intent(this,MyService.class) ) ; Toast.makeText(this,"Point 3",Toast.LENGTH_SHORT).show(); MyService.cla

假设在我的android studio项目中有一个activity、MainActivity和一个ServiceMyService

主课

Toast.makeText(this,"Point 1",Toast.LENGTH_SHORT).show();
startService( new Intent(this,MyService.class) ) ;
Toast.makeText(this,"Point 3",Toast.LENGTH_SHORT).show();
MyService.class

Toast.makeText(this,"Point 2",Toast.LENGTH_SHORT).show();
执行流程是点1->点3->点2&而不是点1->2->3

既然服务只在主ui线程中运行,那个么在后台实际会发生什么呢?因为所有3个点都在同一个线程上执行

编辑:

我可以做什么使执行像1->2->3

在MyService中使用静态变量(并在其中设置一个值)并在MainActivity中导入该变量以检查服务是否已成功启动,这是不起作用的(原因是ANR-reason:Starting.MyService)

主要活动

while(! staticvar.hasBeenSetInMyService){ }

它陷入了无尽的循环。那么,是MainActivity中的静态变量从未更新,还是MyService的onStartCommand()没有执行???

有几种方法可以让组件交换信息。在您的情况下,
活动
可以在启动
服务之前向注册一个
广播接收器

private BroadcastReceiver myReceiver = new BroadcastReceiver(){
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"Received broadcast from Service",Toast.LENGTH_SHORT).show();
        MainActivity.this.doPointThree(); 
    }
}
活动
必须注册并(永远不要忘记!)注销
广播接收器
,但我不会在这里详细介绍并链接到此活动。让我们假设
广播接收器
将注册到

IntentFilter if = new IntentFilter();
if.addAction("your.package.com.POINT_2");
另一方面,
服务
可以在到达“点2”后发送本地广播

此本地广播将触发
BroadcastReceiver
onReceive()


请注意,我指的是本地广播,而不是系统范围内的应用程序间广播。本地广播在系统上很容易,并且对您的应用程序完全保密。

startService
是一种异步功能,它不需要等待服务完全启动。它基本上激发了提供的意图,然后函数就完成了。虽然该服务确实在主线程上运行,但很可能Android系统在服务实际启动之前正在做一些工作,而且很可能是在后台进行的thread@0xDEADC0DE,你为什么不把它作为答案?@0xDEADC0DE我已经更新了我的问题。介意看看吗?@Akhil;现在您正在阻塞主线程,可能会阻止服务启动。这就解释了你的ANR。如果您必须拥有所描述的流程,那么绑定到您的服务可能是一个解决方案。你可以在这里找到相关信息:我确实知道当地广播。但事实是,我一直在寻找另一种解决方案。还有别的办法吗?谢谢@Akhil-如果您不喜欢广播接收器,那么我认为您也不会喜欢使用绑定的
服务
处理程序
s(用于传入的
消息
s)。另一种选择是一种观察者解决方案,其中观察者可以是应用程序类的一个字段。活动必须注册为此观察者的侦听器。最后,还有各种可用的EventBus解决方案,例如Otto EventBus
Intent intent = new Intent();
intent.setAction("your.package.com.POINT_2");
LocalBroadcastManager.getInstance().sendBroadcast(intent);