gpt4 book ai didi

android - 为什么即使应用程序调用了 onDestroy(),Toast 仍然显示?

转载 作者:行者123 更新时间:2023-12-01 00:11:14 26 4
gpt4 key购买 nike

假设我在 onCreate() 中有此代码

   for (int i = 0; i < 20; i++) {
Toast.makeText(MainActivity.this, "Toast "+i, Toast.LENGTH_SHORT).show();
}

当我启动应用程序时,Toasts 开始弹出。

现在,当我按下后退按钮时(比如说在 Toast 5 之后)。 onDestroy()被调用,应用程序被关闭。

但是我仍然可以看到 Toast 弹出,直到它达到 20 或者我从内存中清除应用程序。

问题:

为什么我的代码用完了应用程序?

我已经给出了我的 Activity 的上下文,那么它不应该在 Activity 被破坏后立即停止吗?
context 不是吗?在这里重要吗?

如果您链接任何文档,将会很有帮助。

最佳答案

Toast类(class),Toast.makeText()是静态的method .当你调用这个方法时,一个新的 Toast对象被创建并且你通过了Context保存在其中,系统默认布局用于创建view附在您的 Toast 上还设置了对象和重力来管理您的toast 在屏幕上的位置。将显示。

您的 toast由系统服务显示。该服务维护一个 queuetoast messages使用自己的 Thread 显示和显示它们.当您调用 show()在您的 toast object 上然后它将您的 toast 排入队列进入系统服务的消息队列。所以当你的activity创建后销毁20 toast ,然后系统服务已经开始行动,并且它的 message queue 中有消息显示。按你的activity (销毁时)系统无法断定您可能不打算显示剩余的 toast 消息。只有当你从内存中清除你的应用程序时,系统才能自信地推断它不再需要显示 toast message从您的应用程序。

更多信息可以查看Toast class的源代码。 .我为你包括了相关的方法。顺便说一句,好问题👍🏻

Implementation of Toast.makeText


 /**
* Make a standard toast to display using the specified looper.
* If looper is null, Looper.myLooper() is used.
* @hide
*/
public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
@NonNull CharSequence text, @Duration int duration) {
Toast result = new Toast(context, looper);

LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);

result.mNextView = v;
result.mDuration = duration;

return result;
}

Creation of new Toast :


/**
* Constructs an empty Toast object. If looper is null, Looper.myLooper() is used.
* @hide
*/
public Toast(@NonNull Context context, @Nullable Looper looper) {
mContext = context; // your passed `context` is saved.
mTN = new TN(context.getPackageName(), looper);
mTN.mY = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.toast_y_offset);
mTN.mGravity = context.getResources().getInteger(
com.android.internal.R.integer.config_toastDefaultGravity);
}

Implementation of show()


/**
* Show the view for the specified duration.
*/
public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}

INotificationManager service = getService();
String pkg = mContext.getOpPackageName();
TN tn = mTN;
tn.mNextView = mNextView;
final int displayId = mContext.getDisplayId();

try {
service.enqueueToast(pkg, tn, mDuration, displayId);
} catch (RemoteException e) {
// Empty
}
}

关于android - 为什么即使应用程序调用了 onDestroy(),Toast 仍然显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58556867/

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