我有一个 MyServiceClass 定义如下:
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
如果我从同一包/应用程序/APK 中的 Activity 类调用 startService(new Intent(getBaseContext(), MyService.class));
,那么我可以看到 Toast
消息。
但是,如果我将此类简单地绑定(bind)到启动接收器,将其放入一个没有任何 Activity 的应用程序(即,仅服务应用程序)中:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, com.example.tutorialspoint7.noactivity.MyService.class));
}
}
然后,当服务启动时,我就再也看不到消息了。
我可以通过 Package Browser
按需重启服务:
我明白,如果没有提供 UI 的 Activity ,那么这些消息实际上就没有地方可以显示。不过,我的问题是:
- 是否有默认位置可以找到这些消息? (例如日志文件、缓冲区、LogCat 等)
- 我可以将这些消息重定向到主屏幕当前屏幕吗?
- 为什么 Android Studio 框架在看到/构建的 APK 包含无处可显示的 Toast.makeText().show() 消息时不显示警告?
最佳答案
Toast 消息与您的 Activity 无关,但它是 Android UI 上的一项服务,可以被任何应用程序/Activity 访问。简单浏览一下源代码就会告诉您这一点。 因此,如果您通过 getApplicationContext() 传递应用程序上下文,它也会从无 Activity 的应用程序中显示。
仅供引用: toast 未绑定(bind)到您的 Activity 的 UI。如果您从 Activity 中显示 toast ,然后将其最小化(按主页),则 toast 会保留在主屏幕上。
不,您看不到未显示的 toast 消息,因为它们未在服务本身中排队。
关于 android studio 警告,我不确定它为什么不报告它,您可以提出与此相关的问题。但我读过 android 开发人员建议在所有实例中使用应用程序上下文,即使在 Activity 上下文可用时也是如此。抱歉,我无法从我读到这篇文章的地方找到来源。
关于android - Toast.makeText().show() 消息在 Activity-less 服务中去哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42901845/