Java tutorial
/* * Copyright (C) 2013 Chris Lacy Licensed under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law * or agreed to in writing, software distributed under the License is * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package com.shafiq.mytwittle.service; import java.util.ArrayList; import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.shafiq.mytwittle.view.HomeActivity; public class BackgroundService extends Service { public static final int MSG_REGISTER_CLIENT = 1; public static final int MSG_UNREGISTER_CLIENT = 2; public static final int MSG_SET_INT_VALUE = 3; public static final int MSG_SET_STRING_VALUE = 4; private static boolean mIsRunning = false; ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track // of all // current // registered // clients. int mValue = 0; // Holds last value set by a client. final Messenger mMessenger = new Messenger(new IncomingHandler()); // Target // we // publish // for // clients // to // send // messages // to // IncomingHandler. // private final ServiceStub mBinder = new ServiceStub(this); Context mContext; private NotificationManager mNotificationManager; private BroadcastReceiver mStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); mContext = context; /* * if (BROADCAST_REFRESHSTATE_CHANGED.equals(action)) { if * (!mAsyncTaskManager.hasActivatedTask() && mShouldShutdown) { * stopSelf(); } } else if * (BROADCAST_NOTIFICATION_CLEARED.equals(action)) { final Bundle * extras = intent.getExtras(); if (extras != null && * extras.containsKey(INTENT_KEY_NOTIFICATION_ID)) { * clearNotification(extras.getInt(INTENT_KEY_NOTIFICATION_ID)); } } */ } }; private boolean mShouldShutdown = false; int mCount = 0; private static final int ACTION_AUTO_REFRESH = 1; @SuppressLint("HandlerLeak") private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case ACTION_AUTO_REFRESH: { /* * final long[] activated_ids = * getActivatedAccountIds(TwidereService.this); if * (mPreferences. * getBoolean(PREFERENCE_KEY_REFRESH_ENABLE_HOME_TIMELINE, * false)) { if (!isHomeTimelineRefreshing()) { * getHomeTimeline(activated_ids, null, true); } } if * (mPreferences * .getBoolean(PREFERENCE_KEY_REFRESH_ENABLE_MENTIONS, false)) { * if (!isMentionsRefreshing()) { getMentions(activated_ids, * null, true); } } if (mPreferences.getBoolean( * PREFERENCE_KEY_REFRESH_ENABLE_DIRECT_MESSAGES, false)) { if * (!isReceivedDirectMessagesRefreshing()) { * getReceivedDirectMessages(activated_ids, null, true); } } */ // Log.d("Notifications", "Tick [" + mCount + "]"); mCount += 1; mHandler.removeMessages(ACTION_AUTO_REFRESH); sendMessageToUI(mCount); // showNotification(); // Toast.makeText(mContext, "Toast!!!!", // Constant.DEFAULT_TOAST_DISPLAY_TIME).show(); // final long update_interval = // parseInt(mPreferences.getString(PREFERENCE_KEY_REFRESH_INTERVAL, // "30")) * 60 * 1000; final long update_interval = 20 * 1000; // if (update_interval <= 0 || // !mPreferences.getBoolean(PREFERENCE_KEY_AUTO_REFRESH, false)) // { // break; // } mHandler.sendEmptyMessageDelayed(ACTION_AUTO_REFRESH, update_interval); break; } } } }; public void clearNotification(int id) { switch (id) { /* * case NOTIFICATION_ID_HOME_TIMELINE: { mNewStatusesCount = 0; break; } * case NOTIFICATION_ID_MENTIONS: { mNewMentionsCount = 0; break; } case * NOTIFICATION_ID_DIRECT_MESSAGES: { mNewMessagesCount = 0; break; } */ } mNotificationManager.cancel(id); } // @Override // public IBinder onBind(Intent intent) { // return mBinder; // } @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } class IncomingHandler extends Handler { // Handler of incoming messages from // clients. @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_REGISTER_CLIENT: mClients.add(msg.replyTo); break; case MSG_UNREGISTER_CLIENT: mClients.remove(msg.replyTo); break; case MSG_SET_INT_VALUE: // incrementby = msg.arg1; break; default: super.handleMessage(msg); } } } private void sendMessageToUI(int intvaluetosend) { for (int i = mClients.size() - 1; i >= 0; i--) { try { // Send data as an Integer mClients.get(i).send(Message.obtain(null, MSG_SET_INT_VALUE, intvaluetosend, 0)); // Send data as a String Bundle b = new Bundle(); b.putString("str1", "ab" + intvaluetosend + "cd"); Message msg = Message.obtain(null, MSG_SET_STRING_VALUE); msg.setData(b); mClients.get(i).send(msg); } catch (RemoteException e) { // The client is dead. Remove it from the list; we are going // through the list from back to front so this is safe to do // inside the loop. mClients.remove(i); } } } @Override public void onCreate() { super.onCreate(); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // mAsyncTaskManager = ((TwidereApplication) // getApplication()).getAsyncTaskManager(); // mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, // MODE_PRIVATE); // final IntentFilter filter = new // IntentFilter(BROADCAST_REFRESHSTATE_CHANGED); // filter.addAction(BROADCAST_NOTIFICATION_CLEARED); // registerReceiver(mStateReceiver, filter); mIsRunning = true; startAutoRefresh(); } @Override public void onDestroy() { unregisterReceiver(mStateReceiver); mNotificationManager.cancelAll(); // if (mPreferences.getBoolean(PREFERENCE_KEY_AUTO_REFRESH, false)) { // Auto refresh enabled, so I will try to start service after it was // stopped. // startService(new Intent(INTENT_ACTION_SERVICE)); // } mIsRunning = false; super.onDestroy(); } public void shutdownService() { // Auto refresh is enabled, so this service cannot be shut down. /* * if (mPreferences.getBoolean(PREFERENCE_KEY_AUTO_REFRESH, false)) * return; if (!mAsyncTaskManager.hasActivatedTask()) { stopSelf(); } * else { mShouldShutdown = true; } */ } public boolean startAutoRefresh() { // if (mPreferences.getBoolean(PREFERENCE_KEY_AUTO_REFRESH, false)) { // final long update_interval = // parseInt(mPreferences.getString(PREFERENCE_KEY_REFRESH_INTERVAL, // "30")) * 60 * 1000; Log.d("Notifications", "START"); // Toast.makeText(mContext, "Start!!!!", // Constant.DEFAULT_TOAST_DISPLAY_TIME).show(); final long update_interval = 20 * 1000; if (update_interval <= 0) return false; mHandler.sendEmptyMessageDelayed(ACTION_AUTO_REFRESH, update_interval); return true; // } // return false; } public void stopAutoRefresh() { mHandler.removeMessages(ACTION_AUTO_REFRESH); } /* * */ public static boolean isRunning() { return mIsRunning; } private Notification buildNotification(String message, int icon, Intent content_intent, Intent delete_intent) { final NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setTicker(message); // builder.setContentTitle(getString(R.string.new_notifications)); builder.setContentTitle("New notifications"); builder.setContentText(message); builder.setAutoCancel(true); builder.setWhen(System.currentTimeMillis()); builder.setSmallIcon(icon); builder.setDeleteIntent( PendingIntent.getBroadcast(this, 0, delete_intent, PendingIntent.FLAG_UPDATE_CURRENT)); builder.setContentIntent( PendingIntent.getActivity(this, 0, content_intent, PendingIntent.FLAG_UPDATE_CURRENT)); int defaults = 0; // if (mPreferences.getBoolean(PREFERENCE_KEY_NOTIFICATIONS_HAVE_SOUND, // false)) { defaults |= Notification.DEFAULT_SOUND; // } // if // (mPreferences.getBoolean(PREFERENCE_KEY_NOTIFICATIONS_HAVE_VIBRATION, // false)) { defaults |= Notification.DEFAULT_VIBRATE; // } // if (mPreferences.getBoolean(PREFERENCE_KEY_NOTIFICATIONS_HAVE_LIGHTS, // false)) { defaults |= Notification.DEFAULT_LIGHTS; // } builder.setDefaults(defaults); return builder.getNotification(); } private NotificationManager nm; private void showNotification() { nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // In this sample, we'll use the same text for the ticker and the // expanded notification // CharSequence text = getText(R.string.service_started); // Set the icon, scrolling text and timestamp Notification notification = new Notification(R.drawable.ic_launcher, "Message preview here", System.currentTimeMillis()); // The PendingIntent to launch our activity if the user selects this // notification PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, HomeActivity.class), 0); // Set the info for the views that show in the notification panel. notification.setLatestEventInfo(this, "Count = " + mCount, "Full message here", contentIntent); // Send the notification. // We use a layout id because it is a unique number. We use it later to // cancel. nm.notify(112344, notification); } private void showErrorToast(Exception e, boolean long_message) { // Utils.showErrorToast(this, e, long_message); } }