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