假设我的android studio项目中有一个活动,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点和第2点不是1-> 2-> 3
由于服务仅在主ui线程中运行,所以在后台实际发生了什么?因为所有3个点都在同一个线程上执行。
修改
我可以做什么来执行1-> 2-> 3?
在MyService中使用静态变量(并在那里设置一个值)并在MainActivity中导入该变量以检查服务是否已成功启动,不起作用(导致ANR-原因:启动.MyService)。
在MainActivity中
while(! staticvar.hasBeenSetInMyService){ }
它在无休止的循环中陷入困境。那么静态变量从未在MainActivity中更新过,或者MyService的onStartCommand()没有被执行?
答案 0 :(得分:1)
有几种方法可以让组件交换信息。在您的情况下,Activity
可以在启动BroadcastReceiver
之前使用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
,但我不会在此处详细说明,而是链接到此post on Stack Overflow。让&# 39; s只是假设BroadcastReceiver
将注册
IntentFilter if = new IntentFilter();
if.addAction("your.package.com.POINT_2");
另一方面,Service
可以在到达"点2"后发送本地广播。
Intent intent = new Intent();
intent.setAction("your.package.com.POINT_2");
LocalBroadcastManager.getInstance().sendBroadcast(intent);
此本地广播将触发BroadcastReceiver
onReceive()
请注意,我正在谈论本地广播,而不是系统范围内的应用间广播。本地广播在系统上很容易,并且对您的应用程序完全私密。