首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行流程

执行流程
EN

Stack Overflow用户
提问于 2018-01-19 13:38:14
回答 1查看 80关注 0票数 1

假设我在我的安卓工作室项目中有一个活动,MainActivity和一个服务MyService。

MainActivity.class

代码语言:javascript
复制
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

代码语言:javascript
复制
Toast.makeText(this,"Point 2",Toast.LENGTH_SHORT).show();

执行流程是点1 ->点3 ->点2而不是1->2->3

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

编辑:

我该怎么做才能让死刑变成1->2->3?

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

在MainActivity中

代码语言:javascript
复制
while(! staticvar.hasBeenSetInMyService){ }

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

EN

回答 1

Stack Overflow用户

发布于 2018-01-19 19:13:46

有几种方法可以让组件交换信息。在您的示例中,Activity可以在启动Service之前向LocalBroadcastManager注册一个Service

代码语言:javascript
复制
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,但我不会在这里详细介绍并链接到这个堆叠溢位

代码语言:javascript
复制
IntentFilter if = new IntentFilter();
if.addAction("your.package.com.POINT_2");

另一方面,一旦到达“点2”,Service就可以发送本地广播。

代码语言:javascript
复制
Intent intent = new Intent();
intent.setAction("your.package.com.POINT_2");
LocalBroadcastManager.getInstance().sendBroadcast(intent);

这个本地广播将触发BroadcastReceiveronReceive()

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48342407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档