假设我在我的安卓工作室项目中有一个活动,MainActivity和一个服务MyService。
MainActivity.class
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线程中运行,那么在后台实际会发生什么呢?因为所有三个点都在同一个线程上执行。
编辑:
我该怎么做才能让死刑变成1->2->3?
在MyService中使用静态变量(并在其中设置一个值)并在MainActivity中导入该变量以检查服务是否已成功启动,但不起作用(原因是ANR-原因:启动.MyService )。
在MainActivity中
while(! staticvar.hasBeenSetInMyService){ }它会陷入无穷无尽的循环中。那么,是MainActivity中从未更新过的静态变量,还是MyService的onStartCommand()没有得到执行?
发布于 2018-01-19 19:13:46
有几种方法可以让组件交换信息。在您的示例中,Activity可以在启动Service之前向LocalBroadcastManager注册一个Service。
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();
}
}Activity必须注册并且(永远不要忘记!)取消注册BroadcastReceiver,但我不会在这里详细介绍并链接到这个堆叠溢位。
IntentFilter if = new IntentFilter();
if.addAction("your.package.com.POINT_2");另一方面,一旦到达“点2”,Service就可以发送本地广播。
Intent intent = new Intent();
intent.setAction("your.package.com.POINT_2");
LocalBroadcastManager.getInstance().sendBroadcast(intent);这个本地广播将触发BroadcastReceiver的onReceive()。
请注意,我说的是本地广播,而不是系统范围的应用程序间广播.本地广播在系统上很容易,并且对你的应用程序完全是保密的。
https://stackoverflow.com/questions/48342407
复制相似问题