package com.kale.floatbar.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.IBinder; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout.DrawerListener; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import com.kale.floatbar.R; import com.kale.floatbar.adapter.AppAdapter; import com.kale.floatbar.receiver.HomeKeyReceiver; import com.kale.floatbar.util.Prefs; import com.kale.floatbar.util.Util; /** * @author:Jack Tony * @tips : * @date :2014-8-13 */ public class DrawService extends Service { /** * 定义浮动窗口布局 */ LinearLayout layout; /** * 悬浮窗的布局 */ WindowManager.LayoutParams wmParams; LayoutInflater inflater; /** * 创建浮动窗口设置布局参数的对象 */ WindowManager mWindowManager; /** * 抽屉控件 */ DrawerLayout mDrawerLayout; /** * 抽屉内的布局 */ LinearLayout drawContent; /** * 监听HOME键的广播接受者 */ HomeKeyReceiver receiver; /** * 用来存放每一个recentApplication的信息,我们这里存放应用程序名,应用程序图标和intent。 */ private List<HashMap<String, Object>> appInfos = new ArrayList<HashMap<String, Object>>(); // //////////////////////////////////////////////////////////////////////// /** * 得到存储的对象 */ private Prefs prefs; /** * 抽屉的方向,是从左开的还是从右开的 */ private boolean RIGHT_MODE; private int DRAW_COLOR; /** * 设置抽屉背景图的透明度 */ private int ALPHA; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); prefs = new Prefs(this); // 注册监听home键广播 receiver = new HomeKeyReceiver(); registerReceiver(receiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); initDrawFloating(); updateUi(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); if (layout != null) { // 取消监听home键 unregisterReceiver(receiver); // 移除悬浮窗口 try { mWindowManager.removeView(layout); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } /** * 初始化windowsmanager */ private void initDrawFloating() { mWindowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE); wmParams = Util.getParams(wmParams); wmParams.height = WindowManager.LayoutParams.MATCH_PARENT; wmParams.x = 0; wmParams.y = 0; inflater = LayoutInflater.from(getApplication()); } /** * 更新悬浮窗布局等 */ private void updateUi() { RIGHT_MODE = !prefs.getDrawMode(); DRAW_COLOR = prefs.getDrawColor(); ALPHA = prefs.getDrawAlpha(); // 获取浮动窗口视图所在布局 layout = (LinearLayout) inflater.inflate(RIGHT_MODE ? R.layout.draw_right : R.layout.draw_left, null); // 添加悬浮窗的视图 mWindowManager.addView(layout, wmParams); /** * 设置抽屉控件的打开方向和监听器 */ mDrawerLayout = (DrawerLayout) layout.findViewById(R.id.drawer_layout); mDrawerLayout.setDrawerListener(new MyDrawListener()); mDrawerLayout.openDrawer(RIGHT_MODE ? Gravity.RIGHT : Gravity.LEFT); /** * 设置上方的home键 */ Button home = (Button) layout.findViewById(R.id.home_key); home.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Util.virtualHome(getBaseContext()); stopSelf(); } }); /** * 设置抽屉控件内的背景 */ drawContent = (LinearLayout) layout.findViewById(R.id.drawer_content); drawContent.setBackgroundColor(DRAW_COLOR); drawContent.getBackground().setAlpha(ALPHA); /** * 设置最近任务list中item的个数:20 */ Util.reloadButtons(this, appInfos, 20); ListView listView = (ListView) layout.findViewById(R.id.drawer_list); listView.setAdapter(new AppAdapter(this, mWindowManager, layout, mDrawerLayout, appInfos)); // 悬浮窗显示确定右上角为起始坐标 wmParams.gravity = RIGHT_MODE ? Gravity.RIGHT : Gravity.LEFT | Gravity.TOP; // 以屏幕右上角为原点,设置x、y初始值,确定显示窗口的起始位置 // 添加动画。参考自:http://bbs.9ria.com/thread-242912-1-1.html wmParams.windowAnimations = (RIGHT_MODE) ? R.style.right_anim : R.style.left_anim; mWindowManager.updateViewLayout(layout, wmParams); } /** * @author:Jack Tony * @tips :设置抽屉的监听器。抽屉关闭后直接结束service * @date :2014-8-11 */ private class MyDrawListener implements DrawerListener { @Override public void onDrawerStateChanged(int arg0) { } @Override public void onDrawerSlide(View arg0, float arg1) { } @Override public void onDrawerOpened(View arg0) { } @Override public void onDrawerClosed(View drawerLayout) { stopSelf(); } } }