Как я могу (должен) добавить обработчик в поток в Сервисе? - PullRequest
2 голосов
/ 12 июня 2011

Я все еще работаю над кратким примером службы (стр. 304) из Pro Android 2 Снова пример службы, который состоит из двух классов: BackgroundService.java, показанный ниже, и MainActivity.java, показанный ниже. Теперь я хочу расширить этот код для передачи данных другому виду деятельности в моем приложении. Из того, что я узнал, я добавил начало обработчика в код ниже:

    public class MainActivity extends Activity {
        private static final String TAG = "MainActivity";

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            Log.d(TAG, "starting service");

            Button bindBtn = (Button)findViewById(R.id.bindBtn);
            bindBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    Intent backgroundService = new Intent(MainActivity.this, com.marie.mainactivity.BackgroundService.class);
                    startService(backgroundService);
                }
            });

            Button unbindBtn = (Button)findViewById(R.id.unbindBtn);
            unbindBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    stopService(new Intent(MainActivity.this, BackgroundService.class));
                }
            });
        }
    }

    // The handler code I added
    // I'm not sure what fills out the msg.what field for the switch
    private Handler messageHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {  
            switch(msg.what) {
                //handle update
                //possibly update another activity???
            }
        }

    };

    public class BackgroundService extends Service {
        private NotificationManager notificationMgr;

        @Override
        public void onCreate() {
            super.onCreate();

            notificationMgr = NotificationManager)getSystemService(NOTIFICATION_SERVICE);

            displayNotificationMessage("starting Background Service");

            Thread thr = new Thread(null, new ServiceWorker(), "BackgroundService");
            thr.start();
        }   

        class ServiceWorker implements Runnable
        {
            public void run() {
                mResult = doSomethingTimeConsuming();

                //Use the handler to send update to the main thread or another activity???
                messageHandler.sendMessage(Message.obtain(messageHandler, mResults));

                BackgroundService.this.stopSelf();
            }
        }

        @Override
        public void onDestroy()
        {
            displayNotificationMessage("stopping Background Service");
            super.onDestroy();
        }

        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
        }

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        private void displayNotificationMessage(String message)
        {
            Notification notification = new Notification(R.drawable.note, message, System.currentTimeMillis());

            PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);

            notification.setLatestEventInfo(this, "Background Service", message, contentIntent);

            notificationMgr.notify(R.id.app_notification_id, notification);
        }
    }

Я узнал, что когда я получаю экземпляр службы, я могу передать ему обработчик. Но я не знаю, как это сделать.

Ответы [ 2 ]

1 голос
/ 12 июня 2011

Если вы хотите отправить информацию из службы в деятельность, используйте широковещательные приемники.Сделайте класс приемника вещания внутренним классом вашей активности, чтобы он имел доступ к данным активности.Затем зарегистрируйте трансляцию:

IntentFilter filter = new IntentFilter("com.damluar.intent.action.NEWTWEETS");
broadcastReceiver = new NewTweetsReceiver();
registerReceiver(broadcastReceiver, filter);

И затем из сервиса вы можете отправлять данные для трансляции (и внешней активности) через намерение:

sendBroadcast(new Intent("com.damluar.intent.action.NEWTWEETS"));
0 голосов
/ 12 июня 2011

Вы можете определить функцию установки setHandler(Handler handler) в вашем классе BackgroundSerivce и вызывать ее из MainActivity перед запуском службы и таким образом передать обработчик.

...