当前位置: 首页 > news >正文

SmartWatch2开发-ControlSample分析

为什么80%的码农都做不了架构师?>>>   hot3.png

ControlSample代码路径

安装Sony Add-on SDK后见< Android SDK >\sdk\add-ons\addon-sony_add-on_sdk_2_1-sony-16\samples\SmartExtensions目录

ControlSample是Sony Add-on SDK中的一个Demo,可以运行在Smart Watch2上

运行截图如下

screenshot

ControlSample分析

1.主要结构

  • SamplePreferenceActivity
    供手机端使用的设置界面
  • ExtensionReceiver
    收到特定广播后启动Extension Service
  • SampleExtensionService
    其createControlExtension方法会根据当前的配件信息(是SmartWatch,SmartWatch2还是其他设备)生成一个合适的ControlExtension

class

2.SampleControlSmartWatch2

我们的目标机型是Smart Watch 2, 所以重点分析这个类。

2.1 构造方法

SampleControlSmartWatch2(final String hostAppPackageName, final Context context,
        Handler handler) {
    super(context, hostAppPackageName);
    if (handler == null) {
        throw new IllegalArgumentException("handler == null");
    }
    mHandler = handler;
    setupClickables(context);
    initializeMenus();
}

??为什么这里要从外部传入一个Handler, 虽然是由外部传入的,但并未用于内外通信!!!

2.2 创建布局

    LayoutInflater inflater = (LayoutInflater) context.getSystemService
            (Context.LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.sample_control_2
            , null);
    mLayout = (ControlViewGroup) parseLayout(layout);

注意:

1.sample_control_2.xml中根元素的width为220px, height为176px
2.必须使用parseLayout方法把普通的View转换成ControlViewGroup. (...为什么)
3.ConrtrolViewGroup.findViewById方法返回的是ControlView
4.ConrolView上可以设置click监听

2.3 更新布局

public void onResume() {
    Bundle b1 = new Bundle();
    b1.putInt(Control.Intents.EXTRA_LAYOUT_REFERENCE, R.id.sample_control_text_1);
    b1.putString(Control.Intents.EXTRA_TEXT, "1");

    Bundle b2 = new Bundle();
    b2.putInt(Control.Intents.EXTRA_LAYOUT_REFERENCE, R.id.sample_control_text_2);
    b2.putString(Control.Intents.EXTRA_TEXT, "2");

    Bundle[] data = new Bundle[2];

    data[0] = b1;
    data[1] = b2;

    showLayout(R.layout.sample_control_2, data);

    startAnimation();
}

showLayout接收Bundle数组,可用于更新布局上的文字

    /**
     * @param resourceId The new resource to show.
     */
    private void updateAnimation(int resourceId) {
        sendImage(R.id.animatedImage, resourceId);
    }

sendImage的意思跟setImage类似... (很无语)

2.4 如何使用动画

/**
 * Start showing animation on control.
 */
private void startAnimation() {
    if (!mIsShowingAnimation) {
        mIsShowingAnimation = true;
        mAnimation = new Animation();
        mAnimation.run();
    }
}

/**
 * Stop showing animation on control.
 */
private void stopAnimation() {
    if (mIsShowingAnimation) {
        // Stop animation on accessory
        if (mAnimation != null) {
            mAnimation.stop();
            mHandler.removeCallbacks(mAnimation);
            mAnimation = null;
        }
        mIsShowingAnimation = false;
    }
}

这里的的Animation是使用Handler来定时更新图片模拟实现的

2.5 事件响应

@Override
public void onTouch(final ControlTouchEvent event) {
    if (event.getAction() == Control.Intents.TOUCH_ACTION_RELEASE) {

    }
}

@Override
public void onObjectClick(final ControlObjectClickEvent event) {
    if (event.getLayoutReference() != -1) {
        mLayout.onClick(event.getLayoutReference());
    }
}

@Override
public void onKey(final int action, final int keyCode, final long timeStamp) {
    if (action == Control.Intents.KEY_ACTION_RELEASE
            && keyCode == Control.KeyCodes.KEYCODE_OPTIONS) {
    }
    else if (action == Control.Intents.KEY_ACTION_RELEASE
            && keyCode == Control.KeyCodes.KEYCODE_BACK) {
    }
}

@Override
public void onMenuItemSelected(final int menuItem) {
    Log.d(SampleExtensionService.LOG_TAG, "onMenuItemSelected() - menu item " + menuItem);
    if (menuItem == MENU_ITEM_0) {
        clearDisplay();

    }
}

注意: onMenuItemSelected中调用clearDisplay(),猜测是清屏以隐藏菜单

2.6 弹出菜单

private void toggleMenu() {
    if (mTextMenu) {
        showMenu(mMenuItemsIcons);
    }
    else
    {
        showMenu(mMenuItemsText);
    }
    mTextMenu = !mTextMenu;
}

3 提供Extension注册信息

Extension安装时必须向主应用注册。实现以下方法以提供注册信息

/**
 * Get the extension registration information.
 *
 * @return The registration configuration.
 */
@Override
public ContentValues getExtensionRegistrationConfiguration() {
    String iconHostapp = ...;
    String iconExtension = ...;
    String iconExtension48 = ...;
    String iconExtensionBw = ...;

    ContentValues values = new ContentValues();

	// 提供Extension的设置界面入口
    values.put(Registration.ExtensionColumns.CONFIGURATION_ACTIVITY,
            SamplePreferenceActivity.class.getName());
    values.put(Registration.ExtensionColumns.CONFIGURATION_TEXT,
            mContext.getString(R.string.configuration_text));

	// 提供Extension的名字, 这个名字将显示在SmartConnect的Extension列表中
    values.put(Registration.ExtensionColumns.NAME, mContext.getString(R.string.extension_name));

	// 提供Extension的key, 用于安全校验
    values.put(Registration.ExtensionColumns.EXTENSION_KEY,
            SampleExtensionService.EXTENSION_KEY);

	// 提供一些相关的图片资源
    values.put(Registration.ExtensionColumns.HOST_APP_ICON_URI, iconHostapp);
    values.put(Registration.ExtensionColumns.EXTENSION_ICON_URI, iconExtension);
    values.put(Registration.ExtensionColumns.EXTENSION_48PX_ICON_URI, iconExtension48);
    values.put(Registration.ExtensionColumns.EXTENSION_ICON_URI_BLACK_WHITE, iconExtensionBw);

	// 支持的Notification API版本
    values.put(Registration.ExtensionColumns.NOTIFICATION_API_VERSION,
            getRequiredNotificationApiVersion());

	// 提供当前Extension的包名, 必须唯一
    values.put(Registration.ExtensionColumns.PACKAGE_NAME, mContext.getPackageName());

    return values;
}

注意,这个例子并不支持Notification(没有使用Notification API),所以重写的getRequiredNotificationApiVersion()方法如下:

@Override
public int getRequiredNotificationApiVersion() {
    return 0;
}

如果要使用Notification API,这里就不能简单地返回0了,而要返回你需要的Notification API版本。可参考父类RegistrationInformation中的getRequiredNotificationApiVersion()方法的注释

/**
 * Get the required notifications API version
 *
 * @see Registration.ExtensionColumns#NOTIFICATION_API_VERSION
 * @see #getSourceRegistrationConfigurations
 * @see ExtensionService#onViewEvent
 * @see ExtensionService#onRefreshRequest
 * @return Required notification API version, or 0 if not supporting
 *         notification.
 */
public abstract int getRequiredNotificationApiVersion();

转载于:https://my.oschina.net/apm/blog/182753

相关文章:

  • 回车和换行
  • [Jquery] 实现鼠标移到某个对象,在旁边显示层。
  • 【转】Navigation Drawer(导航抽屉)
  • python的zipfile模块记录
  • fedora 19 安装mp3 解析
  • sqlplus使用总结
  • 利用sql语句复制一条或多条记录
  • 一次union all 的优化
  • PDF格式详解
  • win7,redhat双系统安装的一点看法。
  • 解决eclipse中egit中的cannot open git-upload-pack问题
  • 二手笔记本测试软件
  • VC 2005 解决方案的目录结构设置和管理
  • ldr和adr在使用标号表达式作为操作数的区别
  • 快速搭建YUM源和yum使用
  • C++11: atomic 头文件
  • CSS3 变换
  • E-HPC支持多队列管理和自动伸缩
  • express.js的介绍及使用
  • Javascript基础之Array数组API
  • js数组之filter
  • Less 日常用法
  • MaxCompute访问TableStore(OTS) 数据
  • 构造函数(constructor)与原型链(prototype)关系
  • 如何合理的规划jvm性能调优
  • 网页视频流m3u8/ts视频下载
  • 想写好前端,先练好内功
  • 学习JavaScript数据结构与算法 — 树
  • 赢得Docker挑战最佳实践
  • 用jQuery怎么做到前后端分离
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #13 yum、编译安装与sed命令的使用
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)php投票系统 毕业设计 121500
  • (南京观海微电子)——COF介绍
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .NET Core 2.1路线图
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net MVC + EF搭建学生管理系统
  • .NET MVC第三章、三种传值方式
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .skip() 和 .only() 的使用
  • ??myeclipse+tomcat
  • @SentinelResource详解
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [Android]使用Retrofit进行网络请求
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [Avalon] Avalon中的Conditional Formatting.