Ответ 1
Вам не следует создавать Toast
из Service
. Вместо этого следует использовать Notification
.
У меня есть IntentService, который загружает некоторые файлы. Проблема в том, что я создаю Toast внутри IntentService, как это
Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show();
Тост никогда не исчезнет, если я выйду из приложения. Единственный способ уничтожить его - убить процесс.
Что я делаю неправильно?
Вам не следует создавать Toast
из Service
. Вместо этого следует использовать Notification
.
Проблема заключается в том, что IntentService
не работает в основном потоке приложения. вам нужно получить Handler
для основного потока (в onCreate()
) и отправить Toast
в него как Runnable
.
следующий код должен сделать трюк:
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler();
}
@Override
protected void onHandleIntent(Intent intent) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyIntentService.this, "Hello Toast!", Toast.LENGTH_LONG).show();
}
});
}
Это работает для меня:
public void ShowToastInIntentService(final String sText) {
final Context MyContext = this;
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast toast1 = Toast.makeText(MyContext, sText, Toast.LENGTH_LONG);
toast1.show();
}
});
};
IntentService создаст поток для обработки нового намерения и немедленно прекратит его сразу после выполнения задачи. Таким образом, тост не будет контролироваться мертвой нитью.
Вы должны увидеть некоторые исключения в консоли, когда на экране появится тост.
Для тех, кто развивается в студии Xamarin, вот как это делается:
Handler handler = new Handler ();
handler.Post (() => {
Toast.MakeText (_Context, "Your text here.", ToastLength.Short).Show ();
});
Чтобы показать тост, когда пользователь находится в одном из приложений.
Просто нужна ссылка на текущую активность и вызовите ее с помощью этого примера кода:
public void showToast(final String msg) {
final Activity a = currentActivity;
if (a != null ) {
a.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(a, msg, Toast.LENGTH_SHORT).show();
}
});
}
}
Есть много вариантов для получения текущей активности, проверьте этот вопрос: Как получить текущий контекст активности переднего плана в android?
Но я использую этот подход:
Приложение должно иметь:
private Activity currentActivity = null;
public Activity getCurrentActivity() {
return currentActivity;
}
public void setCurrentActivity(Activity mCurrentActivity) {
this.currentActivity = mCurrentActivity;
}
Каждое действие должно иметь:
@Override
protected void onResume() {
super.onResume();
((MyApplication) getApplication()).setCurrentActivity(this);
}
@Override
protected void onPause() {
super.onPause();
((MyApplication) getApplication()).setCurrentActivity(null);
}