package siso.multilistview;import android.os.Build;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);hideBothNavigationBarAndStatusBar();setContentView(R.layout.activity_main);FloatMenuManager.getInstance().startFloatView(this.getApplicationContext());findViewById(R.id.hideStatuBarNaviBar).setOnClickListener(this);}private void hideBothNavigationBarAndStatusBar() {View decorView = getWindow().getDecorView();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_FULLSCREEN;decorView.setSystemUiVisibility(uiOptions);}}@Overrideprotected void onResume() {super.onResume();hideBothNavigationBarAndStatusBar();FloatMenuManager.getInstance().showFloatingView();}@Overrideprotected void onPause() {super.onPause();FloatMenuManager.getInstance().hideFloatingView();}@Overrideprotected void onDestroy() {super.onDestroy();FloatMenuManager.getInstance().destroy();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.hideStatuBarNaviBar:hideBothNavigationBarAndStatusBar();break;}}}Const.java代码:
package siso.multilistview;public interface Const {String GAME_URL = "http://www.cnblogs.com/cate/html5/";String HOME = "首页";String FAVOUR = "收藏";String FEEDBACK = "客服";String MESSAGE = "消息";String CLOSE = "关闭";String[] MENU_ITEMS = {HOME, FAVOUR, FEEDBACK, MESSAGE, CLOSE};}FloatMenuManager.java代码:
package siso.multilistview;import android.content.ComponentName;import android.content.Context;import android.os.IBinder;import java.io.ObjectStreamException;public class FloatMenuManager implements ServiceConnectionManager.QdServiceConnection {private ServiceConnectionManager mServiceConnectionManager;private FloatMenuManager() {}//静态内部类实现单例 优于双重检查锁(DCL)单例public static FloatMenuManager getInstance() {return FloatMenuHolder.single;}/** * 静态内部类能够解决DCL双重检查锁失效的问题 */private static class FloatMenuHolder {private static final FloatMenuManager single = new FloatMenuManager();}/** * 防止反序列获取新的单例 * * @return * @throws ObjectStreamException */private Object readResolve() throws ObjectStreamException {return FloatMenuHolder.single;}private FloatMenuService mFloatViewService;public void startFloatView(Context context) {if (mFloatViewService != null) {mFloatViewService.showFloat();return;}if (mServiceConnectionManager == null) {mServiceConnectionManager = new ServiceConnectionManager(context, FloatMenuService.class, this);mServiceConnectionManager.bindToService();}}/** */public void addFloatMenuItem() {if (mFloatViewService != null) {}}/** * */public void removeMenuItem() {if (mFloatViewService != null) {}}/** * 显示悬浮图标 */public void showFloatingView() {if (mFloatViewService != null) {mFloatViewService.showFloat();}}/** * 隐藏悬浮图标 */public void hideFloatingView() {if (mFloatViewService != null) {mFloatViewService.hideFloat();}}/** * 释放QDSDK数据 */public void destroy() {if (mFloatViewService != null) {mFloatViewService.hideFloat();mFloatViewService.destroyFloat();}if (mServiceConnectionManager != null) {mServiceConnectionManager.unbindFromService();}mFloatViewService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mFloatViewService = ((FloatMenuService.FloatMenuServiceBinder) service).getService();if (mFloatViewService != null) {mFloatViewService.showFloat();}}@Overridepublic void onServiceDisconnected(ComponentName name) {mFloatViewService = null;}}FloatMenuService.java代码:
package siso.multilistview;import android.app.Service;import android.content.Context;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageManager;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Binder;import android.os.Handler;import android.os.IBinder;import android.view.View;import android.widget.Toast;import com.yw.game.sclib.Sc;import com.yw.game.sclib.ScCreateResultCallback;import java.util.ArrayList;import siso.floatmenu.FloatMenu;import siso.floatmenu.MenuItem;import siso.floatmenu.MenuItemView;public class FloatMenuService extends Service implements View.OnClickListener {private FloatMenu mFloatMenu;private final static String TAG = FloatMenuService.class.getSimpleName();private Handler mHandler = new Handler();private int[] menuIcons = new int[]{R.drawable.yw_menu_account, R.drawable.yw_menu_favour, R.drawable.yw_menu_fb, R.drawable.yw_menu_msg, R.drawable.yw_menu_close};@Overridepublic IBinder onBind(Intent intent) {return new FloatMenuServiceBinder();}/** * On create. */@Overridepublic void onCreate() {super.onCreate();ArrayList<MenuItem> mMenuItems = new ArrayList<>();for (int i = 0; i < menuIcons.length; i++) {mMenuItems.add(new MenuItem(menuIcons[i], Const.MENU_ITEMS[i], android.R.color.black, this));}mFloatMenu = new FloatMenu.Builder(this).menuItems(mMenuItems).build();mFloatMenu.show();}/** * On click. * * @param v the v */@Overridepublic void onClick(View v) {if (v instanceof MenuItemView) {MenuItemView menuItemView = (MenuItemView) v;String menuItemLabel = menuItemView.getMenuItem().getLabel();Toast.makeText(this, menuItemLabel, Toast.LENGTH_SHORT).show();switch (menuItemLabel) {case Const.HOME:// TODO WHAT U WANT 此处模拟联网操作mFloatMenu.startLoaderAnim();new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}mHandler.post(new Runnable() {@Overridepublic void run() {mFloatMenu.stopLoaderAnim();goHomeIndex(FloatMenuService.this);}});}}).start();break;case Const.FAVOUR:createSc();break;case Const.FEEDBACK:break;case Const.MESSAGE:if (hasNewMsg) {hasNewMsg = false;} else {hasNewMsg = true;}showRed();break;case Const.CLOSE:hideFloat();break;}}}private boolean hasNewMsg = false;private void showRed() {if (!hasNewMsg) {mFloatMenu.changeLogo(R.drawable.yw_image_float_logo, R.drawable.yw_menu_msg, 3);} else {mFloatMenu.changeLogo(R.drawable.yw_image_float_logo_red, R.drawable.yw_menu_msg_red, 3);}}private void createSc() {//在service中的使用场景PackageManager pm = this.getPackageManager();ApplicationInfo appInfo = FloatMenuService.this.getApplicationInfo();Drawable drawable = appInfo.loadIcon(pm);//当前app的logoString name = appInfo.loadLabel(pm).toString();//当前app的名称Intent intent = pm.getLaunchIntentForPackage(appInfo.packageName);//当前app的入口程序intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);new Sc.Builder(this, intent).setName(name).setAllowRepeat(true).setIcon(drawable).setCallBack(new ScCreateResultCallback() {@Overridepublic void createSuccessed(String createdOrUpdate, Object tag) {Toast.makeText(FloatMenuService.this, createdOrUpdate, Toast.LENGTH_SHORT).show();}@Overridepublic void createError(String errorMsg, Object tag) {Toast.makeText(FloatMenuService.this, errorMsg, Toast.LENGTH_SHORT).show();}}).build().createSc();}/** * Show float. */public void showFloat() {if (mFloatMenu != null)mFloatMenu.show();}/** * Hide float. */public void hideFloat() {if (mFloatMenu != null) {mFloatMenu.hide();}}/** * Destroy float. */public void destroyFloat() {hideFloat();if (mFloatMenu != null) {mFloatMenu.destroy();}mFloatMenu = null;}/** * On destroy. */@Overridepublic void onDestroy() {super.onDestroy();destroyFloat();}public class FloatMenuServiceBinder extends Binder {public FloatMenuService getService() {return FloatMenuService.this;}}private void goHomeIndex(Context context) {Uri uri = Uri.parse(Const.GAME_URL);Intent intent = new Intent(Intent.ACTION_VIEW, uri);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}}ServiceConnectionManager.java代码:
package siso.multilistview;import android.app.Service;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.IBinder;public class ServiceConnectionManager implements ServiceConnection {private final Context context;private final Class<? extends Service> service;private boolean attemptingToBind = false;private boolean bound = false;private QdServiceConnection mQdServiceConnection;public ServiceConnectionManager(Context context, Class<? extends Service> service, QdServiceConnection mQdServiceConnection) {this.context = context;this.service = service;this.mQdServiceConnection = mQdServiceConnection;}public void bindToService() {if (!attemptingToBind) {attemptingToBind = true;context.bindService(new Intent(context, service), this, Context.BIND_AUTO_CREATE);}}@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {attemptingToBind = false;bound = true;mQdServiceConnection.onServiceConnected(componentName, iBinder);}@Overridepublic void onServiceDisconnected(ComponentName componentName) {mQdServiceConnection.onServiceDisconnected(componentName);bound = false;}public void unbindFromService() {attemptingToBind = false;if (bound) {context.unbindService(this);bound = false;}}public interface QdServiceConnection {void onServiceConnected(ComponentName name, IBinder service);void onServiceDisconnected(ComponentName name);}}activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:clipChildren="false"android:clipToPadding="false"tools:context=".MainActivity"><TextViewandroid:id="@+id/text"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="通过服务启动浮动菜单"android:textAppearance="@style/TextAppearance.AppCompat.Body2"/><Buttonandroid:id="@+id/hideStatuBarNaviBar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/text"android:text="隐藏状态栏和导航栏"/></RelativeLayout>AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="siso.multilistview"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><!-- android:configChanges="keyboardHidden|orientation|screenSize"防止横竖屏切换时重新执行oncreate--><activity android:name=".MainActivity"android:configChanges="keyboardHidden|orientation|screenSize"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".FloatMenuService"/></application></manifest>Android Library Project(库项目)结构:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。