【问题标题】:How is Toast is displayed by a Service - Android服务如何显示 Toast - Android
【发布时间】:2015-08-06 06:42:34
【问题描述】:

所以我在我的应用中注册了一个 BroadcastReceiver,一旦触发就会启动一个服务。

Service 类方法在被调用时会显示一个 Toast,在测试之后确实会显示。

但是如果应用没有运行/被销毁,如果传递到Toast.makeText(Context context, CharSequence text, int duration) 的上下文是一个从未实例化的上下文,那么 Toast 怎么可能被显示?

我的意思是,应用程序没有运行/被销毁,所以上下文变量从未初始化。

主要活动:

public class MapsActivity extends FragmentActivity {

    MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // Some code here.

        // Instantiate the context.
        context = MapsActivity.this;

        registerReceiver(mBroadcastReceiver, new IntentFilter());

    }
}

广播接收器

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            MapsActivity.context.startService(new Intent(context, MyService.class));
        }
    }
}

服务

public class MyService extends Service {

    @Override
    public void onCreate() {
        Toast.makeText(MapsActivity.context, "Service onCreate", Toast.LENGTH_LONG).show();
    }

    // Some other super methods.
}

【问题讨论】:

  • 我不明白你的问题。您的吐司是否显示,您不知道为什么?您的吐司是否没有显示,但您希望显示?还有什么?
  • 我的 Toast 显示出来了,我不知道为什么,因为传递给参数的上下文为空?
  • 是吗?上下文是否为空?你是怎么测试的?
  • 提示:如果收到广播,那么它就被注册了,那么你的上下文确实被初始化了。如果您的应用程序已完全终止,您将不会收到广播。但是,拥有静态上下文确实是一个非常糟糕的主意。由于 Service 也是一个上下文,因此请使用它而不是您的活动的上下文。
  • 我实际上没有。但是为什么上下文不为空?服务是否随时调用活动 onCreate?我只是想了解一下,以便了解其背后的逻辑。

标签: android service broadcastreceiver toast


【解决方案1】:

之所以有效,是因为您的 Context 保存在一个静态字段中,该字段的生命周期与进程之一一样长。并且正在运行的服务保持进程处于活动状态。

但是这是糟糕的设计!您不应该以这种方式在上下文中保留引用,尤其是在您不需要的情况下:

Service 本身实现了Context,因此您可以将MapsActivity.context 替换为this。当然这同样适用于BroadcastReceiver:使用参数context 而不是MapsActivity.context

【讨论】:

  • 您可以从 Service 和 BroadcastReceiver 访问上下文。
  • @Saurabh 你说得对,我在答案中包含了这个。
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多