https://www.gravatar.com/avatar/7a0c24f697ea1587001c36d00039b60f?s=240&d=mp

[转]使用设备管理策略来加强信息安全

课程内容

  1. 定义和声明您的策略
  2. 创建 Device Administration Receiver
  3. 激活设备管理器
  4. 实现设备策略控制器

您还应该阅读

动手试试

下载示例代码DeviceManagement.zip

从 Android 2.2 (API level 8)版本开始,Android平台通过设备管理API提供了系统级的设备管理能力。

这节课程将会介绍如何创建一个安全相关的程序,该程序通过执行设备管理策略来保护设备信息的安全。具体来说,该程序可以配置锁屏密码的强度,通过该配置来保护敏感的信息。这个和大家在公司使用的Windows电脑一样, 公司会定义好电脑密码的策略 — 比如要求是大于8位同时包含3种不同类型字符的密码 — 这样来保证电脑不会轻易的被破解掉密码,从而保护电脑里面的资料。

定义和声明您的策略

首先,需要定义支持的策略种类。设备策略包含锁屏密码强度、密码失效时间 等。

您必须在 res/xml/device_admin.xml 文件中定义使用的策略集合,程序会应用该策略到设备上。同时在Manifest文件中需要引用声明的策略集合。

每个声明的策略都对应DevicePolicyManager 类中的一个或者几个相关的函数。如果一个程序尝试调用一个没有在XML文件中声明过的策略函数,会抛出一个 SecurityException  异常。如果程序想管理其他类型的策略,可以使用其他的权限 — 比如 force-lock。在后面您会看到,在设备管理器的激活流程中会有一个系统界面告诉用户您所声明的策略集合列表。

下面的代码在res/xml/device_admin.xml文件中定义了limit password 策略:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <limit-password />
    </uses-policies>
</device-admin>

在 manifest 文件中引用定义的策略:

<receiver android:name=".Policy$PolicyAdmin" android:permission="android.permission.BIND_DEVICE_ADMIN">
    <strong><meta-data android:name="android.app.device_admin"
        android:resource="@xml/device_admin" /></strong>
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

创建 Device Administration Receiver

当您定义的策略事件发生的时候会通知您创建的这个设备管理器Receiver。可以根据情况覆盖(Override)需要的回调函数。

在Device Admin这个示例程序中,如果用户撤销了设备管理器,示例程序所配置的策略信息将会清除。您需要考虑实现符合您的使用情况的业务逻辑。例如,程序可以删除一些敏感信息来减轻安全风险、还可以禁用远程同步功能 等。

不要忘了在manifest文件中注册您的Receiver。

public static class PolicyAdmin extends DeviceAdminReceiver {

    @Override
    public void onDisabled(Context context, Intent intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent);
        SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE);
        prefs.edit().clear().commit();
    }
}

激活设备管理器

在执行任何策略之前,用户需要手工的激活设备管理器。下面的代码演示了如何触发设置界面来让用户激活您的设备管理器程序。包含一个介绍文本内容告诉用户为啥您的程序需要激活为设备管理器是个不错的选择, 通过在Intent中设置 EXTRA_ADD_EXPLANATION  字段。

[转]Android通过代理使用新API

课程内容

  1. 使用新API实现Tabs
  2. Implement CompatTabHoneycomb
  3. Implement TabHelperHoneycomb

您还应该阅读

动手试试

下载示例代码
TabCompat.zip

这节课程将演示如何使用新的API来实现CompatTab和** TabHelper** 。该实现可以在支持新特性的系统上运行。

使用新API实现Tabs

通过_proxy代理_的方式来实现CompatTab 和 TabHelper 类。由于抽象的API和新的API是一样的,所以只要通过代理把对这些方法的调用委托给新的API即可。

在具体实现中您可以直接使用新的API,由于这些具体的实现类是延时加载的,所以当运行在旧的设备上时不会导致程序Crash。只要您不在3.0之前的系统上调用Honeycomb相关的具体实现,则 Dalvik VM 就不会 抛出 [VerifyError](http://developer.android.com/reference/java/lang/VerifyError.html) 异常。

好的命名策略就是使用具体的版本号对应的名称来命名,这样方便以后管理。由于这里的实现是基于3.0新功能的,所以我们的实现类名字就为CompatTabHoneycomb 和 TabHelperHoneycomb

http://www.ithome.me/wp-content/uploads/2013/07/backward-compatible-ui-classes-honeycomb-300x124.png

Implement CompatTabHoneycomb

CompatTabHoneycomb 实现了 CompatTab 抽象类,该类的实现中只是把每个函数的调用委托给 ActionBar.Tab对象,该对象从Activity中获取。

public class CompatTabHoneycomb extends CompatTab {
    // The native tab object that this CompatTab acts as a proxy for.
    ActionBar.Tab mTab;
    ...

    protected CompatTabHoneycomb(FragmentActivity activity, String tag) {
        ...
        // Proxy to new ActionBar.newTab API
        mTab = activity.getActionBar().newTab();
    }

    public CompatTab setText(int resId) {
        // Proxy to new ActionBar.Tab.setText API
        mTab.setText(resId);
        return this;
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

Implement TabHelperHoneycomb

同样,TabHelperHoneycomb实现了TabHelper 抽象类。 函数的调用都委托给ActionBar对应的函数了。

[转]使用和版本关联的组件

课程内容

  1. 添加选择逻辑
  2. 创建一个版本感知的Activity Layout
  3. 在Activity中使用 TabHelper

动手试试

Download the sample app TabCompat.zip

这节内容介绍如何添加选择不同实现的逻辑以及如何在对应的版本中选择对应的实现方式,如何创建版本感知的布局。

添加选择逻辑

TabHelpe 抽象类作为factory工厂方法 类来创建版本相关的TabHelper 和 CompatTab 实例。

public abstract class TabHelper {
...
// Usage is TabHelper.createInstance(activity)
public static TabHelper createInstance(FragmentActivity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return new TabHelperHoneycomb(activity);
} else {
return new TabHelperEclair(activity);
}
}

// Usage is mTabHelper.newTab("tag")
public CompatTab newTab(String tag) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return new CompatTabHoneycomb(mActivity, tag);
} else {
return new CompatTabEclair(mActivity, tag);
}
}
...
}

创建一个版本感知的Activity Layout

然后是创建一个支持两种tab实现的布局。对于旧的实现方式 (TabHelperEclair),布局中包含 TabWidget  和 TabHost ,和一个包含tab的容器:

[转]使用旧的API来实现接口

课程内容

  1. 选择一种替代方案
  2. 使用旧的API实现Tabs

动手试试

下载示例代码 TabCompat.zip

这节内容介绍如何在旧版本上模仿新版本的功能。

选择一种替代方案

在旧版本中实现新的UI特性的最具挑战性的任务就是:选择一种旧版本支持的替代方案。有时候使用旧版本中的UI特性可以模仿新的UI特性。例如:

  • Action bars 可以使用一个包含一些图片按钮的水平 LinearLayout 来实现。浮动菜单按钮可以通过Menu按钮来模拟。
  • Action bar tabs 同样可以使用包含按钮的水平LinearLayout实现,或者使用 TabWidget  UI控件。
  • NumberPicker  和 Switch 控件可以分别由Spinner  和 ToggleButton 控件来替代。
  • ListPopupWindow  和 PopupMenu  控件可以通过PopupWindow  控件来模拟。 There generally isn’t a one-size-fits-all solution for backporting newer UI components to older devices. Be mindful of the user experience: on older devices, users may not be familiar with newer design patterns and UI components. Give some thought as to how the same functionality can be delivered using familiar elements. In many cases this is less of a concern—if newer UI components are prominent in the application ecosystem (such as the action bar), or where the interaction model is extremely simple and intuitive (such as swipe views using a ViewPager ).

使用旧的API实现Tabs

这里我们使用 TabWidget  和TabHost 来模拟抽象的API功能。 具体的实现类为 TabHelperEclair 和 CompatTabEclair,名字暗示了该实现只支持Android 2.0 (Eclair)以后的版本。

[转]抽象新的API

课程内容

  1. 研究抽象接口
  2. 创建抽象后的Tab接口
  3. 抽象ActionBar.Tab
  4. 抽象ActionBar Tab 的函数

您还应该阅读

动手试试

下载示例代码

TabCompat.zip

在本示例中,您将创建一个tab UI控件接口,该接口在不同的Android版本中使用不同的实现方式。本课程介绍如何创建这样一个抽象接口。

研究抽象接口

Abstraction  在Java语言中意味着隐藏实现细节。在使用新的API时,可以使用抽象机制来 创建一个版本相关的控件,该控件在新版本中使用新API,在旧版本中使用旧API。

当使用这种方式的时候,您需要确定在旧版本中需要使用那些新版本的特性,然后基于新的接口来创建一个抽象类。在定义新的抽象接口的时候,应该尽可能的反映出新的特性(尽可能的复制新的API定义)。这样可以尽可能的向前兼容,并且当某一天您觉得不再需要抽象层的时候很容易的切换回来。

一旦为新的API创建了抽象接口后,就可以定义多个实现类并且在运行时来选择使用那个实现方式。不同的API level对应的实现方式可能不一样。

创建抽象后的Tab接口

为了创建向后兼容版本的tabs,需要首先定义您的程序需要哪些特性和具体的API。在这里的顶部导航tab中,我们 假设有如下特性:

  1. Tab 指示器,包含文字和图片
  2. Tabs 可以和Fragment关联起来
  3. Activity 应该可以监听到Tab切换事件 预先准备这些需求可以让你精确的控制抽象层的范围。这意味着您可以使用较少的时间创建多个抽象层实现,并且尽可能早的使用兼容性的实现。

这里用于Tabs的关键API为 [ActionBar](http://developer.android.com/reference/android/app/ActionBar.html) 和 [ActionBar.Tab](http://developer.android.com/reference/android/app/ActionBar.Tab.html)。 您需要抽象这些API来使您的Tabs和系统版本关联起来。这个项目中需要支持Eclair (API level 5) 同时能够使用Honeycomb (API Level 11)版本中的新特性。下图显示了该抽象API在 这两种版本中的具体实现关系图。

http://www.ithome.me/wp-content/uploads/2013/07/backward-compatible-ui-classes1-300x114.png

[转]DD-WRT路由器迅雷离线脱机下载

1、首先请确认你拥有一个迅雷 VIP 帐号,非会员无法使用离线下载。

2、到 https://github.com/iambus/xunlei-lixian/downloads  下载 xunlei-lixian  代码,并解压到本地

3、打开解压后的文件夹,找到 lixian_cli.py ,将第1行的

#!/usr/bin/env python

修改为

#!/opt/bin/python2.7

然后将 lixian_download_tools.py 第22行的

修改为

保存后将目录中的文件全部复制到路由器的 /opt/bin/lixian 目录(tests目录、.gitignore 和 README.md 无需复制)

4、为 lixian_cli.py 创建别名

使用 ssh 客户端连接至路由器,键入如下命令:

之后就可以在 /opt 目录下使用 xunlei 来调用 xunlei-lixian  了。

5、建立配置文件

使用 ssh 客户端连接至路由器,键入如下命令:

完成后将 /tmp/root/.xunlei.lixian.config 复制到 /opt/bin/lixian 目录下。