LocalServiceBroadcaster.java revision e2104f4b5c8e3ad63570306a25e61502dfe4c418
16c1b3b1e32f960f44e47d8484510f5c5f8e5343fChris Lattner/*
2ee9102587e7f6fc95de9fc5731b341eeb9bfc3caDaniel Dunbar * Copyright (C) 2011 The Android Open Source Project
3ee9102587e7f6fc95de9fc5731b341eeb9bfc3caDaniel Dunbar *
4b6804e91267381427866dfc1ae3d88abd02ddf14Daniel Dunbar * Licensed under the Apache License, Version 2.0 (the "License");
527c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner * you may not use this file except in compliance with the License.
627c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner * You may obtain a copy of the License at
727c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner *
827c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner *      http://www.apache.org/licenses/LICENSE-2.0
927c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner *
1027c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner * Unless required by applicable law or agreed to in writing, software
1127c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner * distributed under the License is distributed on an "AS IS" BASIS,
1227c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner * See the License for the specific language governing permissions and
1427c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner * limitations under the License.
1527c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner */
1627c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattner
1727c5215fbd59c2e8262dd14d63ada96ce3cfd351Chris Lattnerpackage com.example.android.supportv4.content;
18c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar
19022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbarimport com.example.android.supportv4.R;
20022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbar
21c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbarimport android.app.Activity;
22022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbarimport android.app.Service;
23022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbarimport android.content.BroadcastReceiver;
24c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbarimport android.content.Context;
25022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbarimport android.content.Intent;
26c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbarimport android.content.IntentFilter;
27022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbarimport android.os.Bundle;
28c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbarimport android.os.Handler;
29022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbarimport android.os.IBinder;
30c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbarimport android.os.Message;
31022e2a84a867ba73fd0e6b89f61e56396f22620dDaniel Dunbarimport android.support.v4.app.ServiceCompat;
32b834f5d13d824dc4da2ce0df2aa8dffb697b8974Daniel Dunbarimport android.support.v4.content.LocalBroadcastManager;
33b834f5d13d824dc4da2ce0df2aa8dffb697b8974Daniel Dunbarimport android.view.View;
34b834f5d13d824dc4da2ce0df2aa8dffb697b8974Daniel Dunbarimport android.view.View.OnClickListener;
35b834f5d13d824dc4da2ce0df2aa8dffb697b8974Daniel Dunbarimport android.widget.Button;
36b834f5d13d824dc4da2ce0df2aa8dffb697b8974Daniel Dunbarimport android.widget.TextView;
37b834f5d13d824dc4da2ce0df2aa8dffb697b8974Daniel Dunbar
388a3ee718cdaa153e29c079548e6755184d5426e4Daniel Dunbar/**
398a3ee718cdaa153e29c079548e6755184d5426e4Daniel Dunbar * Demonstrates the use of a LocalBroadcastManager to easily communicate
408a3ee718cdaa153e29c079548e6755184d5426e4Daniel Dunbar * data from a service to any other interested code.
415fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar */
42c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbarpublic class LocalServiceBroadcaster extends Activity {
435fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar    static final String ACTION_STARTED = "com.example.android.supportv4.STARTED";
445fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar    static final String ACTION_UPDATE = "com.example.android.supportv4.UPDATE";
455fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar    static final String ACTION_STOPPED = "com.example.android.supportv4.STOPPED";
46c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar
475fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar    LocalBroadcastManager mLocalBroadcastManager;
485fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar    BroadcastReceiver mReceiver;
495fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar
50c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar    @Override
515fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar    protected void onCreate(Bundle savedInstanceState) {
525fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar        super.onCreate(savedInstanceState);
5344f63f9335bfb487a2e94cbe20d2950bbdef840eDaniel Dunbar
54c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar        setContentView(R.layout.local_service_broadcaster);
55ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar
565fe6338ac859707f797bf6db6d043bb5f4d944a1Daniel Dunbar        // This is where we print the data we get back.
5744f63f9335bfb487a2e94cbe20d2950bbdef840eDaniel Dunbar        final TextView callbackData = (TextView)findViewById(R.id.callback);
58c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar
59ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar        // Put in some initial text.
60ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar        callbackData.setText("No broadcast received yet");
61ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar
62c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar        // We use this to send broadcasts within our local process.
63ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar        mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
64ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar
65ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar        // We are going to watch for interesting local broadcasts.
66c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar        IntentFilter filter = new IntentFilter();
67ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar        filter.addAction(ACTION_STARTED);
68ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar        filter.addAction(ACTION_UPDATE);
69ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar        filter.addAction(ACTION_STOPPED);
70c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar        mReceiver = new BroadcastReceiver() {
71ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar            @Override
72ea6408f8cd17b065e414611e01a7133d118429e9Daniel Dunbar            public void onReceive(Context context, Intent intent) {
730db68f4e3a8be1641dbba72a41baa6ff1b5dd6afDaniel Dunbar                if (intent.getAction().equals(ACTION_STARTED)) {
74926f2bb3d8dd6f8b0198aa478828ee02914050f9Daniel Dunbar                    callbackData.setText("STARTED");
750db68f4e3a8be1641dbba72a41baa6ff1b5dd6afDaniel Dunbar                } else if (intent.getAction().equals(ACTION_UPDATE)) {
761095f2ae261d231a63d329b0ebbf6eaf566ff429Daniel Dunbar                    callbackData.setText("Got update: " + intent.getIntExtra("value", 0));
771095f2ae261d231a63d329b0ebbf6eaf566ff429Daniel Dunbar                } else if (intent.getAction().equals(ACTION_STOPPED)) {
78c22e0b2443afdedb6d9b225b938ad404d63cdbe6Daniel Dunbar                    callbackData.setText("STOPPED");
791095f2ae261d231a63d329b0ebbf6eaf566ff429Daniel Dunbar                }
80e7070e90066acc3460af1d6cac4036a80b0250b8Daniel Dunbar            }
81e7070e90066acc3460af1d6cac4036a80b0250b8Daniel Dunbar        };
82e7070e90066acc3460af1d6cac4036a80b0250b8Daniel Dunbar        mLocalBroadcastManager.registerReceiver(mReceiver, filter);
83e7070e90066acc3460af1d6cac4036a80b0250b8Daniel Dunbar
84e7070e90066acc3460af1d6cac4036a80b0250b8Daniel Dunbar        // Watch for button clicks.
85e7070e90066acc3460af1d6cac4036a80b0250b8Daniel Dunbar        Button button = (Button)findViewById(R.id.start);
8612ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        button.setOnClickListener(mStartListener);
8712ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        button = (Button)findViewById(R.id.stop);
8812ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        button.setOnClickListener(mStopListener);
8912ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby    }
9012ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
9112ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby    @Override
9212ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby    protected void onDestroy() {
9312ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        super.onDestroy();
9412ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        mLocalBroadcastManager.unregisterReceiver(mReceiver);
9512ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby    }
9612ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
9712ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby    private OnClickListener mStartListener = new OnClickListener() {
9812ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        @Override
99df967d613704d4e4f01ecce85c1846dfab4d9a1bChris Lattner        public void onClick(View v) {
100df967d613704d4e4f01ecce85c1846dfab4d9a1bChris Lattner            startService(new Intent(LocalServiceBroadcaster.this, LocalService.class));
101df967d613704d4e4f01ecce85c1846dfab4d9a1bChris Lattner        }
102df967d613704d4e4f01ecce85c1846dfab4d9a1bChris Lattner    };
103df967d613704d4e4f01ecce85c1846dfab4d9a1bChris Lattner
104df967d613704d4e4f01ecce85c1846dfab4d9a1bChris Lattner    private OnClickListener mStopListener = new OnClickListener() {
105df967d613704d4e4f01ecce85c1846dfab4d9a1bChris Lattner        @Override
10661129252e44067ae112dc856c64c814344b7e7c9Chris Lattner        public void onClick(View v) {
10761129252e44067ae112dc856c64c814344b7e7c9Chris Lattner            stopService(new Intent(LocalServiceBroadcaster.this, LocalService.class));
10861129252e44067ae112dc856c64c814344b7e7c9Chris Lattner        }
10961129252e44067ae112dc856c64c814344b7e7c9Chris Lattner    };
11061129252e44067ae112dc856c64c814344b7e7c9Chris Lattner
11112ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby    public static class LocalService extends Service {
11212ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        LocalBroadcastManager mLocalBroadcastManager;
11312ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        int mCurUpdate;
11412ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
11512ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        static final int MSG_UPDATE = 1;
11612ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
11712ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        Handler mHandler = new Handler() {
11812ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            @Override
11912ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            public void handleMessage(Message msg) {
12012ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                switch (msg.what) {
12112ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                    case MSG_UPDATE: {
12212ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                        mCurUpdate++;
12312ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                        Intent intent = new Intent(ACTION_UPDATE);
12412ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                        intent.putExtra("value", mCurUpdate);
12512ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                        mLocalBroadcastManager.sendBroadcast(intent);
12612ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                        Message nmsg = mHandler.obtainMessage(MSG_UPDATE);
12712ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                        mHandler.sendMessageDelayed(nmsg, 1000);
12812ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                    } break;
12912ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                    default:
13012ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                        super.handleMessage(msg);
13112ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby                }
13212ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            }
13312ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        };
13412ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
13512ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        @Override
13612ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        public void onCreate() {
13712ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            super.onCreate();
13812ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
1399c60f534cbdec2ba58b269c4d624ae4d301ef73aDaniel Dunbar        }
14012ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
14112ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        @Override
14212ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        public int onStartCommand(Intent intent, int flags, int startId) {
1439c60f534cbdec2ba58b269c4d624ae4d301ef73aDaniel Dunbar            // Tell any local interested parties about the start.
14412ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STARTED));
14512ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
14612ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            // Prepare to do update reports.
1479c60f534cbdec2ba58b269c4d624ae4d301ef73aDaniel Dunbar            mHandler.removeMessages(MSG_UPDATE);
14812ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            Message msg = mHandler.obtainMessage(MSG_UPDATE);
14912ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            mHandler.sendMessageDelayed(msg, 1000);
15012ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            return ServiceCompat.START_STICKY;
1519c60f534cbdec2ba58b269c4d624ae4d301ef73aDaniel Dunbar        }
15212ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
15312ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        @Override
15412ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        public void onDestroy() {
1559c60f534cbdec2ba58b269c4d624ae4d301ef73aDaniel Dunbar            super.onDestroy();
15612ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby
15712ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            // Tell any local interested parties about the stop.
15812ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STOPPED));
1599c60f534cbdec2ba58b269c4d624ae4d301ef73aDaniel Dunbar
16012ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            // Stop doing updates.
16112ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby            mHandler.removeMessages(MSG_UPDATE);
16212ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        }
1639c60f534cbdec2ba58b269c4d624ae4d301ef73aDaniel Dunbar
16412ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        @Override
16512ce0de4622df7bcc15ba6c8818b98c0b936876aKevin Enderby        public IBinder onBind(Intent intent) {
166e16b0fc3cb607bd0b8240733e2fe829d78df3833Chris Lattner            return null;
167e16b0fc3cb607bd0b8240733e2fe829d78df3833Chris Lattner        }
168e16b0fc3cb607bd0b8240733e2fe829d78df3833Chris Lattner    }
169e16b0fc3cb607bd0b8240733e2fe829d78df3833Chris Lattner}
170e16b0fc3cb607bd0b8240733e2fe829d78df3833Chris Lattner