1c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn/* 2c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * 4c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * you may not use this file except in compliance with the License. 6c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * You may obtain a copy of the License at 7c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * 8c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * 10c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * See the License for the specific language governing permissions and 14c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * limitations under the License. 15c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn */ 16c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 17c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornpackage com.example.android.supportv4.content; 18c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 19c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.app.Activity; 20c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.app.Service; 21c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.content.BroadcastReceiver; 22c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.content.Context; 23c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.content.Intent; 24c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.content.IntentFilter; 25c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.os.Bundle; 26c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.os.Handler; 27c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.os.IBinder; 28c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.os.Message; 29c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.view.View; 30c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.view.View.OnClickListener; 31c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.widget.Button; 32c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornimport android.widget.TextView; 33c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 34def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.app.ServiceCompat; 35def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.localbroadcastmanager.content.LocalBroadcastManager; 36def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 37def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport com.example.android.supportv4.R; 38def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 39c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn/** 40c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * Demonstrates the use of a LocalBroadcastManager to easily communicate 41c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn * data from a service to any other interested code. 42c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn */ 43c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackbornpublic class LocalServiceBroadcaster extends Activity { 44c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn static final String ACTION_STARTED = "com.example.android.supportv4.STARTED"; 45c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn static final String ACTION_UPDATE = "com.example.android.supportv4.UPDATE"; 46c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn static final String ACTION_STOPPED = "com.example.android.supportv4.STOPPED"; 47c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 48c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn LocalBroadcastManager mLocalBroadcastManager; 49c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn BroadcastReceiver mReceiver; 50c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 51c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn @Override 52c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn protected void onCreate(Bundle savedInstanceState) { 53c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn super.onCreate(savedInstanceState); 54c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 55c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn setContentView(R.layout.local_service_broadcaster); 56c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 57c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // This is where we print the data we get back. 58c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn final TextView callbackData = (TextView)findViewById(R.id.callback); 59c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 60c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // Put in some initial text. 61c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn callbackData.setText("No broadcast received yet"); 62c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 63c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // We use this to send broadcasts within our local process. 64c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 65c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 66c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // We are going to watch for interesting local broadcasts. 67c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn IntentFilter filter = new IntentFilter(); 68c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn filter.addAction(ACTION_STARTED); 69c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn filter.addAction(ACTION_UPDATE); 70c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn filter.addAction(ACTION_STOPPED); 71c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mReceiver = new BroadcastReceiver() { 72c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn @Override 73c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public void onReceive(Context context, Intent intent) { 74c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn if (intent.getAction().equals(ACTION_STARTED)) { 75c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn callbackData.setText("STARTED"); 76c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } else if (intent.getAction().equals(ACTION_UPDATE)) { 77c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn callbackData.setText("Got update: " + intent.getIntExtra("value", 0)); 78c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } else if (intent.getAction().equals(ACTION_STOPPED)) { 79c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn callbackData.setText("STOPPED"); 80c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 81c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 82c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn }; 83c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mLocalBroadcastManager.registerReceiver(mReceiver, filter); 84c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 85c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // Watch for button clicks. 86c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn Button button = (Button)findViewById(R.id.start); 87c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn button.setOnClickListener(mStartListener); 88c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn button = (Button)findViewById(R.id.stop); 89c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn button.setOnClickListener(mStopListener); 90c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 91c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 92c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn @Override 93c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn protected void onDestroy() { 94c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn super.onDestroy(); 95c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mLocalBroadcastManager.unregisterReceiver(mReceiver); 96c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 97c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 98c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn private OnClickListener mStartListener = new OnClickListener() { 99e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 100c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public void onClick(View v) { 101c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn startService(new Intent(LocalServiceBroadcaster.this, LocalService.class)); 102c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 103c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn }; 104c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 105c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn private OnClickListener mStopListener = new OnClickListener() { 106e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 107c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public void onClick(View v) { 108c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn stopService(new Intent(LocalServiceBroadcaster.this, LocalService.class)); 109c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 110c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn }; 111c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 112c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public static class LocalService extends Service { 113c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn LocalBroadcastManager mLocalBroadcastManager; 114c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn int mCurUpdate; 115c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 116c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn static final int MSG_UPDATE = 1; 117c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 118c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn Handler mHandler = new Handler() { 119c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn @Override 120c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public void handleMessage(Message msg) { 121c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn switch (msg.what) { 122c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn case MSG_UPDATE: { 123c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mCurUpdate++; 124c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn Intent intent = new Intent(ACTION_UPDATE); 125c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn intent.putExtra("value", mCurUpdate); 126c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mLocalBroadcastManager.sendBroadcast(intent); 127c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn Message nmsg = mHandler.obtainMessage(MSG_UPDATE); 128c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mHandler.sendMessageDelayed(nmsg, 1000); 129c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } break; 130c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn default: 131c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn super.handleMessage(msg); 132c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 133c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 134c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn }; 135c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 136c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn @Override 137c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public void onCreate() { 138c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn super.onCreate(); 139c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 140c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 141c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 142e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 143c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public int onStartCommand(Intent intent, int flags, int startId) { 144c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // Tell any local interested parties about the start. 145c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STARTED)); 146c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 147c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // Prepare to do update reports. 148c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mHandler.removeMessages(MSG_UPDATE); 149c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn Message msg = mHandler.obtainMessage(MSG_UPDATE); 150c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mHandler.sendMessageDelayed(msg, 1000); 151109979ea9794aa98665d125ebe6a90448ff65f1fSvetoslav Ganov return ServiceCompat.START_STICKY; 152c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 153c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 154c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn @Override 155c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public void onDestroy() { 156c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn super.onDestroy(); 157c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 158c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // Tell any local interested parties about the stop. 159c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STOPPED)); 160c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 161c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn // Stop doing updates. 162c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn mHandler.removeMessages(MSG_UPDATE); 163c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 164c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn 165c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn @Override 166c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn public IBinder onBind(Intent intent) { 167c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn return null; 168c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 169c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn } 170c252b20c103ec3a34411c54baf9d40768bf71e88Dianne Hackborn} 171