执行流程

时间:2018-01-19 13:38:15

标签: java android

假设我的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()没有被执行?

1 个答案:

答案 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()

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