主要活动完成后如何显示服务中的Toast? [英] How to display Toast from a Service after main Activity finishes?
问题描述
更新:我不同意这是重复的-因为我正在寻找退出主应用程序并仍然从该服务显示Toast的方法.
UPDATE: I don't agree that this is a duplicate - because I am seeking for a way to exit the main app and still show a Toast from the service.
在
单击任何按钮将运行带有相应操作字符串(打开"或闪光")的服务-
Clicking any of the buttons will run a service with a corresponding action string ("open" or "flash") -
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);
}
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();
}
不幸的是,我的应用崩溃了:
Unfortunately my app crashes with:
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编程新手,我想知道如何显示从服务以正确的方式敬酒?
Being an Android programming newbie I wonder How to display a Toast from Service in a correct way?
我想我已经在Android Home上看到Toasts(即设备屏幕上没有活动",但仍然有Toasts).
I think I've already seen Toasts at Android Home (i.e. there was no Activity on the device screen and still there were Toasts).
我的背景:我想从我的服务中监视信标设备,并显示一些Toasts文字-即使我的应用已关闭.
My background: I would like to monitor a beacon device from my service and show some text Toasts - even when my app has been closed.
推荐答案
OnHandleIntent
将在不同的Thread
中运行
因此,您正在android中不允许的线程中显示Toast
OnHandleIntent
will run in a differant Thread
so you are showing Toast
in a thread which is not allowed in 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();
}
});
从此服务中的死线程
IntentService将创建一个线程来处理新的意图,并在任务完成后立即终止它.因此,Toast将不受死线程的控制.
IntentService will create a thread to handle the new intent, and terminated it immediately once the task has done. So, the Toast will be out of controlled by a dead thread.
当吐司显示在屏幕上时,您应该在控制台中看到一些例外情况.
You should see some exceptions in the console when the toast showing on the screen.
这篇关于主要活动完成后如何显示服务中的Toast?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!