How to display Toast from a Service after main Activity finishes?

后端 未结 5 2274
一生所求
一生所求 2020-12-14 10:22

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.

In a

相关标签:
5条回答
  • 2020-12-14 10:46

    OnHandleIntent is called on a background thread, and any attempt to touch the UI will result in a crash. Use an Handler to post a Runnable on the UI Thread to show your toast.

    private class MyRunnable implements Runnable {
    
       final int mTextId = -1; 
       final Context mContext;
       public MyRunnable(Context c, int textId) {
           mTextId = textId;
           mContext = c;
       }
    
       @Override
       public void run() {
           Toast.makeText(mContext, 
               getString(mTextId), 
               Toast.LENGTH_SHORT).show();             
        }
    }
    
       Handler handler = new Handler();
       handler.post(new MyRunnable(this, R.string.car_opened));
    
    0 讨论(0)
  • 2020-12-14 10:48

    An IntentService has a few limitations:

    It can't interact directly with your user interface. To put its results in the UI, you have to send them to an Activity.

    Everything is happening in the background thread and not on the UI thread, so you need a different way as shown below:

    @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();                
            } 
        }); 
    } 
    

    Source: Toast created in an IntentService never goes away

    0 讨论(0)
  • 2020-12-14 10:52

    This problem because of not running the Toast from the main_thread, and to overcome that, when creating the Activity save it's context from onCreate() method:

    public static Context ctx;
    
    // the method responsible for running the MainActivity
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            ctx = this;
    }
    

    then, in the service add a handler and run a thread from it(as the Handler is executed through the main Thread):

        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(OpenActivity.ctx, getString(R.string.car_opened),
                        Toast.LENGTH_SHORT).show();
            }
        });
    
    0 讨论(0)
  • 2020-12-14 10:57

    use the following code:

      runOnUiThread(new Runnable(){
         public void run() {
              // UI code goes here
         }
        });
    
    0 讨论(0)
  • 2020-12-14 11:04

    OnHandleIntent will run in a differant Thread so you are showing Toast in a thread which is not allowed in android

    so change your code like this

    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();              
        }
    });
    

    From this dead thread in service

    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.

    0 讨论(0)
提交回复
热议问题