How to have Android Service communicate with Activity

前端 未结 13 1897
说谎
说谎 2020-11-22 02:54

I\'m writing my first Android application and trying to get my head around communication between services and activities. I have a Service that will run in the background an

13条回答
  •  难免孤独
    2020-11-22 03:25

    Besides LocalBroadcastManager , Event Bus and Messenger already answered in this question,we can use Pending Intent to communicate from service.

    As mentioned here in my blog post

    Communication between service and Activity can be done using PendingIntent.For that we can use createPendingResult().createPendingResult() creates a new PendingIntent object which you can hand to service to use and to send result data back to your activity inside onActivityResult(int, int, Intent) callback.Since a PendingIntent is Parcelable , and can therefore be put into an Intent extra,your activity can pass this PendingIntent to the service.The service, in turn, can call send() method on the PendingIntent to notify the activity via onActivityResult of an event.

    Activity

    public class PendingIntentActivity extends AppCompatActivity
    {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    PendingIntent pendingResult = createPendingResult(
    100, new Intent(), 0);
    Intent intent = new Intent(getApplicationContext(), PendingIntentService.class);
    intent.putExtra("pendingIntent", pendingResult);
    startService(intent);
    
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 100 && resultCode==200) {
    Toast.makeText(this,data.getStringExtra("name"),Toast.LENGTH_LONG).show();
    }
    super.onActivityResult(requestCode, resultCode, data);
    }
    }
    

    Service

    public class PendingIntentService extends Service {
    
        private static final String[] items= { "lorem", "ipsum", "dolor",
                "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi",
                "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam",
                "vel", "erat", "placerat", "ante", "porttitor", "sodales",
                "pellentesque", "augue", "purus" };
        private PendingIntent data;
    
        @Override
        public void onCreate() {
            super.onCreate();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            data = intent.getParcelableExtra("pendingIntent");
    
            new LoadWordsThread().start();
            return START_NOT_STICKY;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    
        class LoadWordsThread extends Thread {
            @Override
            public void run() {
                for (String item : items) {
                    if (!isInterrupted()) {
    
                        Intent result = new Intent();
                        result.putExtra("name", item);
                        try {
                            data.send(PendingIntentService.this,200,result);
                        } catch (PendingIntent.CanceledException e) {
    
                            e.printStackTrace();
                        }
                        SystemClock.sleep(400);
    
                    }
                }
            }
        }
    }
    

提交回复
热议问题