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