gpt4 book ai didi

android - 如何在主要 Activity 完成后显示服务中的 Toast?

转载 作者:可可西里 更新时间:2023-11-01 19:09:03 25 4
gpt4 key购买 nike

更新:我不同意这是重复的 - 因为我正在寻找一种方法来退出主应用程序并仍然显示服务中的 Toast。

a very simple test app我有 2 个按钮:

screenshot

单击任何按钮将运行具有相应操作字符串(“open”或“flash”)的服务 -

OpenActivity.java :

public class OpenActivity extends Activity {
private Intent mServiceIntent;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_open);
mServiceIntent = new Intent(this, RegionService.class);
}

public void openCar(View v) {
mServiceIntent.setAction("open");
startService(mServiceIntent);
}

RegionService.java :

public class RegionService extends IntentService {
private static final String TAG = "RegionService";

@Override
protected void onHandleIntent(Intent intent) {
Log.d(TAG, "Received an intent: " + intent);
String action = intent.getAction();
Log.d(TAG, "Received an action: " + action);

if(action.equals("open")) {
Toast.makeText(this,
getString(R.string.car_opened),
Toast.LENGTH_SHORT).show();
}

不幸的是我的应用崩溃了:

D/RegionService(24506): Received an intent: Intent { act=open cmp=de.afarber.mynotification/.RegionService }

D/RegionService(24506): Received an action: open

W/MessageQueue(24506): Handler (android.os.Handler) {422768a8} sending message to a Handler on a dead thread
W/MessageQueue(24506): java.lang.RuntimeException: Handler (android.os.Handler) {422768a8} sending message to a Handler on a dead thread
W/MessageQueue(24506): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:320)
W/MessageQueue(24506): at android.os.Handler.enqueueMessage(Handler.java:626)
W/MessageQueue(24506): at android.os.Handler.sendMessageAtTime(Handler.java:595)
W/MessageQueue(24506): at android.os.Handler.sendMessageDelayed(Handler.java:566)
W/MessageQueue(24506): at android.os.Handler.post(Handler.java:326)
W/MessageQueue(24506): at android.widget.Toast$TN.hide(Toast.java:370)
W/MessageQueue(24506): at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:54)
W/MessageQueue(24506): at android.os.Binder.execTransact(Binder.java:412)
W/MessageQueue(24506): at dalvik.system.NativeStart.run(Native Method)

作为一个Android编程新手,我想知道如何显示Toast从服务以正确的方式?

我想我已经在 Android Home 上看到了 Toasts(即设备屏幕上没有 Activity 但仍然有 Toasts)。

我的背景:我想通过我的服务监控信标设备并显示一些文本 Toasts - 即使我的应用已关闭。

最佳答案

OnHandleIntent 将在不同的 Thread 中运行所以你在一个线程中显示 Toast 这在 android 中是不允许的

所以像这样改变你的代码

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {

@Override
public void run() {
Toast.makeText(getApplicationContext(),
getString(R.string.car_opened),
Toast.LENGTH_SHORT).show();
}
});

从这里dead thread in service

IntentService 将创建一个线程来处理新的 Intent ,并在任务完成后立即终止它。因此,Toast 将不受死线程的控制。

当 toast 显示在屏幕上时,您应该会在控制台中看到一些异常。

关于android - 如何在主要 Activity 完成后显示服务中的 Toast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27358134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com