The NoteBook of EricKong

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

#

下面是本篇的大纲:

    * 1、AppWidget 框架类
    * 2、在 Android 如何使用 Widget
    * 3、AppWidget 框架的主要类介绍
    * 4、DEMO 讲解

1、AppWidget 框架类

    * 1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。
    * 2、 AppWidgetProvderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的 res/xml/目录下。
    * 3、AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。
    * 4、RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。

2、在 Android 如何使用 Widget

    * 1、长按主界面
1.jpg
    * 2、之后弹出一个对话框,里面就有android 内置的一些桌面组件
appwidget.png

3、AppWidget 框架的主要类介绍

1) AppWidgetManger 类

    * bindAppWidgetId(int appWidgetId, ComponentName provider)
      通过给定的ComponentName 绑定appWidgetId
    * getAppWidgetIds(ComponentName provider)
      通过给定的ComponentName 获取AppWidgetId
    * getAppWidgetInfo(int appWidgetId)
      通过AppWidgetId 获取 AppWidget 信息
    * getInstalledProviders()
      返回一个List<AppWidgetProviderInfo>的信息
    * getInstance(Context context)
      获取 AppWidgetManger 实例使用的上下文对象
    * updateAppWidget(int[] appWidgetIds, RemoteViews views)
      通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件
    * updateAppWidget(ComponentName provider, RemoteViews views)
      通过 ComponentName 对传进来的 RemoeteView 进行修改,并重新刷新AppWidget 组件
    * updateAppWidget(int appWidgetId, RemoteViews views)
      通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件

2) 继承自 AppWidgetProvider 可实现的方法为如下:

    * 1、onDeleted(Context context, int[] appWidgetIds)
    * 2、onDisabled(Context context)
    * 3、onEnabled(Context context)
    * 4、onReceive(Context context, Intent intent)
      Tip:因为 AppWidgetProvider 是继承自BroadcastReceiver  所以可以重写onRecevie 方法,当然必须在后台注册Receiver
    * 5、onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

4、Demo讲解

下面是我今天做的一个实例,提供给大家练习时做参考,效果如下:在布局中放一个 TextView 做桌面组件,然后设置TextView 的 Clickable="true" 使其有点击的功能,然后我们点击它时改变它的字体,再点击时变回来,详细操作如下流程:

    * 1、新建AppWidgetProvderInfo
    * 2、写一个类继承自AppWidgetProvider
    * 3、后台注册Receiver
    * 4、使 AppWidget 组件支持点击事件
    * 5、如何使TextView 在两种文本间来回跳转

问题抛出来了,那么一起解决它吧。

1、新建AppWidgetProvderInfo

代码如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:minWidth="60dp"
  4.     android:minHeight="30dp"
  5.     android:updatePeriodMillis="86400000"
  6.      
  7.     android:initialLayout="@layout/main">
  8. </appwidget-provider>
复制代码
Tip:上文说过AppWidgetProvderInfo 是在res/xml 的文件形式存在的,看参数不难理解,比较重要的是这里android:initialLayout="@layout/main" 此句为指定桌面组件的布局文件。

2、写一个类继承自AppWidgetProvider

主要代码如下:
  1. public class widgetProvider extends AppWidgetProvider
复制代码
并重写两个方法
  1. @Override
  2.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,
  3.             int[] appWidgetIds) {}

  4. @Override
  5.     public void onReceive(Context context, Intent intent) {}
复制代码
Tip:onUpdate 为组件在桌面上生成时调用,并更新组件UI,onReceiver 为接收广播时调用更新UI,一般这两个方法是比较常用的。

3、后台注册Receiver

后台配置文件代码如下:
  1. <receiver android:name=".widgetProvider">
  2.             <meta-data android:name="android.appwidget.provider"
  3.                 android:resource="@xml/appwidget_provider"></meta-data>
  4.             <intent-filter>
  5.                 <action android:name="com.terry.action.widget.click"></action>
  6.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  7.                  
  8.             </intent-filter>
  9.         </receiver>
复制代码
Tip:因为是桌面组件,所以暂时不考虑使用Activity 界面,当然你在实现做项目时可能会需要点击时跳转到Activity 应用程序上做操作,典型的案例为Android  提供的音乐播放器。上面代码中比较重要的是这一句 <meta-data android:name="android.appwidget.provider"  android:resource="@xml/appwidget_provider"></meta-data>  大意为指定桌面应用程序的AppWidgetProvderInfo  文件,使其可作其管理文件。

4、使 AppWidget 组件支持点击事件

先看代码:
  1. public static void updateAppWidget(Context context,
  2.             AppWidgetManager appWidgeManger, int appWidgetId) {
  3.         rv = new RemoteViews(context.getPackageName(), R.layout.main);
  4.         Intent intentClick = new Intent(CLICK_NAME_ACTION);
  5.         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
  6.                 intentClick, 0);
  7.         rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
  8.         appWidgeManger.updateAppWidget(appWidgetId, rv);
  9.     }
复制代码
此方法为创建组件时 onUpdate 调用的更新UI的方法,代码中使用RemoteView 找到组件的布局文件,同时为其设置广播接收器CLICK_NAME_ACTION并且通过RemoteView 的setOnClickPendingIntent 方法找到我想触发事件的TextView 为其设置广播。接着
  1. @Override
  2.     public void onReceive(Context context, Intent intent) {
  3.         // TODO Auto-generated method stub
  4.         super.onReceive(context, intent);

  5.         if (rv == null) {
  6.             rv = new RemoteViews(context.getPackageName(), R.layout.main);
  7.         }
  8.         if (intent.getAction().equals(CLICK_NAME_ACTION)) {
  9.             if (uitil.isChange) {
  10.                 rv.setTextViewText(R.id.TextView01, context.getResources()
  11.                         .getString(R.string.load));

  12.             } else {
  13.                 rv.setTextViewText(R.id.TextView01, context.getResources()
  14.                         .getString(R.string.change));

  15.             }
  16.             Toast.makeText(context, Boolean.toString(uitil.isChange),
  17.                     Toast.LENGTH_LONG).show();
  18.             uitil.isChange = !uitil.isChange;

  19.         }
  20.         AppWidgetManager appWidgetManger = AppWidgetManager
  21.                 .getInstance(context);
  22.         int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
  23.                 context, widgetProvider.class));
  24.         appWidgetManger.updateAppWidget(appIds, rv);
  25.     }
复制代码
在onReceiver 中通过判断传进来的广播来触发动作。

5、如何使TextView 在两种文本间来回跳转

如何 TextView 在来两种状态中来回呢?这也是我比较调试最久的一个难点,问题出在对 AppWidget 的理解不够深入。 如果我的设想没错的话AppWidget 的生命周期应该在每接收一次广播执行一次为一个生命周期结束,也就是说你在重写的 AppWidgetProvider 类里面声明全局变量做状态判断,每次状态改变AppWidgetProvider 再接收第二次广播时即为你重新初始化也就是说桌件为你重新实例化了一次AppWidgetProvider 。今天我因为在里面放了一个boolean 值初始化为true ,观察调试看到每次进入都为TRUE 故你在设置桌面组件时,全局变量把它声明在另外一个实体类用来判断是没问题的,切忌放在本类。代码参考onReceiver方法。

效果图如下:
fasada.png

代码:
package com.terry;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.Toast;

public class widgetProvider extends AppWidgetProvider {
    private static final String CLICK_NAME_ACTION = "com.terry.action.widget.click";

    private static RemoteViews rv;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds;
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);

        if (rv == null) {
            rv = new RemoteViews(context.getPackageName(), R.layout.main);
        }
        if (intent.getAction().equals(CLICK_NAME_ACTION)) {
            if (uitil.isChange) {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.load));

            } else {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.change));

            }
            Toast.makeText(context, Boolean.toString(uitil.isChange),
                    Toast.LENGTH_LONG).show();
            uitil.isChange = !uitil.isChange;

        }
        AppWidgetManager appWidgetManger = AppWidgetManager
                .getInstance(context);
        int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
                context, widgetProvider.class));
        appWidgetManger.updateAppWidget(appIds, rv);
    }

    public static void updateAppWidget(Context context,
            AppWidgetManager appWidgeManger, int appWidgetId) {
        rv = new RemoteViews(context.getPackageName(), R.layout.main);
        Intent intentClick = new Intent(CLICK_NAME_ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                intentClick, 0);
        rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
        appWidgeManger.updateAppWidget(appWidgetId, rv);
    }
}
widget.rar (42.55 KB, 下载次数: 42)
posted @ 2012-04-07 21:48 Eric_jiang 阅读(359) | 评论 (0)编辑 收藏

想必用过大机的人都接触过Block, Track, Cylinder的概念。Mainframe的存储管理一般就是基于这几个单位。

那么,Mainframe上1个Cylinder是多少个Track?1个Track是多少个KB?1个Track包含多少个Block?

 

对于第一个问题,多数人都知道答案是15,基于一般的磁盘设备,15这个答案没有错,但是对于磁带,应该是没有柱面这个概念的。(这个有待探讨,毕竟大家真用过磁带的不多,而做备份是不需要手动分配存储的)

 

第二个问题,1个Track是多少个KB?

经过查阅相关IBM官方文档,可以得知,不同类型的设备,1个Track包含的KB数不等。

对于最常见的3390设备,1 Track = 56,664 Bytes;对于3380设备,1 Track = 47,476Bytes。

(参考文献:IBM System Storage DS8000 Information Center,章节LUN calculation)

 

第三个问题,1个Track包含多少个Block?

首先,Block的大小是自定义的,能够定义的最大的Block Size是32760(bytes)。如果定义一个Block为32760 bytes,那么无论对于3390还是3380,一个Track只能包含1个block。无疑这是很大的浪费,因为这个track上剩下的Bytes是无法取用的。(1个Track只能隶属于1个文件,而且block不可以span track)

所以,空间最优化的block size方案是1个track放2个block。因为block之间有inter block gap,1个track上剩下的可用byte数为55,996个,所以,最优的block size数值为最接近但不超过27,998的那个record size的整数倍的数值。

posted @ 2012-03-31 17:47 Eric_jiang 阅读(447) | 评论 (0)编辑 收藏

数据集的创建:

数据集的创建有两种情况:1分区数据集的创建,2连续数据集的创建。

 分区数据集的创建步骤如下:在ISPF主菜单下选择3-Utilitis,然后是2-Data Set,在面板最上面就会看到有8种操作可以进行,在选项区域输入字母 A,但是不要按 ENTER 键,然后在数据集名字区域中输入新数据集的名字,但是同样也不要按ENTER 键。名字可以用单引号引起来(例如,’yourid.LIB.SOURCE)或不用引号引起来(LIB.SOURCE)以便TSO/ISPF 能够自动的把当前的 TSO用户ID 作为HLQ 使用。然后在卷序号区域输入 WORK02,按ENTER键。 完成指定的参数设置并且按 ENTER 

 – Space Units = TRKS           (这是一个为后面数据设置的单位,意为磁道)

 – Primary quantity = 10         (为数据集分配 10 个磁道的主空间)

 – Secondary quantity = 5      5个磁道的追加空间)

 – Directory blocks = 10         10个目录空间足够了)

 – Record format = FB         (数据集的记录格式是 FB

 – Record length = 80          (逻辑记录的长度是 80 字节)

 – Block size = 0                   (this tells z/OS to select an optimum value) (在Record formatFB的情况下,这个区域如果要自定义的话一定要是上一个参数Record length的整数倍,至于原因,可以从上一篇文章中找)

 – Data set type = PDS         PDS代表分区数据集,HFS代表分级文件系统,是Z/OS UNIX文件系统,LIBRARY表示库,BLANK表示什么不知道)

系统执行创建数据集的操作完毕以后,在屏幕的右上的角落,可以看到成功或者失败的 消息。

顺序数据集的创建与分区数据集的创建的不同之处在于填写参数的时候要在Directory blocks 项填0,因为顺序数据集中根本不需要目录,分配空间又要何用。然后还要把Data set type 保持为空,即BLANK,这样子创建出来的一个DATA SET就是一个顺序数据集。同样你会在右上角看到创建成功与否的提示信息。

数据集的列表总览:

我刚才学会了创建数据集,那么我如何去看我们的数据集在哪呢?其实我已经知道它就在创建数据集时指定的那个VOLUME中,但是,我还是想看一看VOLUME下倒底有哪些数据数据集呢?原来可以在ISPF下使用3.4即Dlist选项,在其中的Dsname level右边填上你的用户名,或者就是你的HLQ,然后回车,就可以得到一个数据集的列表,或者你不填写Dsname level,而是填写了下面那个Volume serial,那么得到的就是这个卷中的所有的数据集的列表,如下面这个图所示:

在这个界面中,用PF10PF11左右翻动可以显示更多的信息,这种情况并不是真正的滚动;只有当使用PF11 PF10 时才能获得额外的信息。 第一个 PF11 显示的内容包括磁道、使用百分比、分区和设备类型。分区值是用于获得显示磁道总数的分区数量。ISPF 实用程序可以看到数据集实际使用的空间的大小,且如果可能的话,它还可以作为一个百分比来显示。第二个 PF11 显示的内容包括 DCB 特性:数据集组织形式(DSORG)、数据集记录格式(RECFM)、逻辑记录长度(LRECL)和组块的长度(BLKSIZE)。PS 代表顺序数据集,PO 代表分区数据集,VS 代表 VSAM 数据集,BLANK 代表未知组织或者不存在数据集 

RECFMLRECL BLKSIZE 应该是比较熟悉的。在某些情况下,若没有使用一个标准的访问方法或没有写入数据时,这些参数是不能确定的。VSAM 数据集没有这些参数的直接数值,通常是以问号来表示。

在这个界面下按F1可以查看到可以对数据集进行的一些操作的命令,如S ,E B等等,这时在某一个要编辑的数据集左侧,对应于上方蓝色的Command列下面输入命令,然后回车就可以执行命令了。比如用E,就马上进入该数据集的编辑状态。

数据集的编辑:

如果是一个连续数据集,我们可以直接在ISPF主菜单的2选项EDIT里面,输入数据集名称,直接进行编辑状态,在编辑环境下,有两种命令格式,一种是主命令,就是在Command那一行输入来使用的命令,它们常见的有:

AUTOSAVE ON/OFF,打开关闭自动保存

AUTONUM ON/OFF,自动重新编号行号(SAVE后生效)

CANCLE:取消所做的编辑并退出编辑环境
CAPS ON/OFF:退出编辑环境后系统自动将所有字母转换为大写/小写
CHANGERCHANGE):替换字符,RCHANGE表示重复上次的替换。格式:CHANGE ** ** [ALL]
FINDRFIND):查找字符串
RECOVERY ON/OFF:设置编辑方式,ON表示用户可以通过UNDO命令取消上一次编辑操作
RESET:重置编辑器,清除不需要的信息
SAVE:保存当前修改,并继续编辑
SORT:对文档行按字典顺序排序
SUBMIT:提交作业;若作业是一段JCL程序,则通过该命令可以提交作业程序
UNDO:取消上一次编辑(仅当在RECOVERY ON编辑方式下)
ssetup+member:创建新成员(PDS
CUT:复制当前内容(配合CCMM来使用)
PASTE:粘贴当前内容(配合CUT来用 很常用)
COPY+member-name:复制同一DATASETMEMBER内容(配合AB使用)

HEX ON/OFF,打开关闭十六进制编码形式;
HI+XXX:高亮显示某种语言(JCL COBOL REXX等等)
MEMBER+member-name:查询当前所有DATASET下该member是否存在(非常实用)
PROFILE:列出当前编辑环境的所有的editor profile
HEX ON/OFF:打开关闭十六进制编码形式
AUTOSAVE ON/OFF:打开关闭自动保存
AUTONUM ON/OFF:自动重新编号行号(SAVE后生效)

PROFILE, 列出当前编辑环境的所有的editor profile
PROFILE UNLOCK/LOCK:可以修改ISPFeditor profile
PACK ON/OFF:是否将该MEMBER保存成PACK格式(一种主机上标准的压缩格式)
TABS ON/OFF:编辑的时候是否允许用TAB键跳格

如果是编辑REXXCOBOLJCL等,可以用 HI REXX, HI COBOL HI JCL,让语言的关键字高亮显示。这个对阅读程序帮助很大

命令 COPY member1 就会把 member1 的内容拷贝到当前的文件中。

命令 CUT 可以把当前文件的内容拷贝到剪贴板中,然后到你要你要粘入的文件,使用PASTE 命令 拷贝到该文件。

CTRL+HOME显示隐藏十字光标(十字光标是干什么滴?)

另一种命令是行命令,是输入在文本行中的左侧EDIT下面列来使用的命令,常见的行命令如下:

CCCCxx:拷贝命令。与其他行命令(AB)或主命令 结合使用 C 拷贝当前行,CC拷贝多行,用两个CC来定位,Cxx拷贝多行,XX表示行数
IIXX:插入命令。执行一次插入命令后,可直接按回车(ctrl)换行
DDDDxx:删除
RRRRxx:复制
O:覆盖当前内容(结合CR来用)
A:定位于当前行之前
B:定位于当前行之后
XXXXxx:隐藏
SSxx:显示隐藏的内容
COLS:屏幕的刻度标尺
UCUCxx:转换成大写
LCLCxx:转换成小写
(, (xx:将当前行左移一列或xx(或者<)
), )xx :将当前行右移一列或xx(或者>)
TS:将一行文本切分为两行
TF:将多行文本合并为一行

行命令还有O,配合AB一起使用能够覆盖指定的行相同位置

还有列于最下行的功能键都有提示,就不说了。

编辑完了F3可保存退出。F12不保存退出。

如果数据集是一个分区数据集,如果是一个刚刚建立的分区数据集,我们按前述进行编辑的时候,右上角会提示 No member in data set,这个就是说明了,一个分区数据集是不能拿来直接编辑的,因为它是一个顺序数据集的集合,它相当于一个文件夹,怎么可以拿来直接编辑呢,所以要先在其中建立顺序数据集,这个顺序数据集一般被称为MEMBER,然后再对MEMBER进行相应的编辑。如何给分区数据集添加顺序数据集呢?很简单,就在如上的两处环境下在Data set name一项中填上数据集名称,然后在后面加上一个括号,其中写上要添加的成员的名字就可以了(例如LIB.COURCE(MEM1)),然后回车就直接进入编辑状态了。如果是一个已经有成员的分区数据集,填写好数据集名称,不用加什么括号然后直接回车,会出现一个成员列表,再在其中进行选择,然后选择一个数据集来编辑就可以了,编辑命令当然跟前面说过的那两种命令相同了。

数据集的删除:

数据集的删除可以在3.2下面用D命令进行,也可以在3.4下面用D命令进行。这个比较简单。

数据集的重命名:

数据集的重命名跟删除一样,可以在3.2下面用R命令进行,也可以在3.4下面用R命令进行。这个也比较简单。

数据集的移动和拷贝:

假定用户需要复制位于卷WORK02中的数据集 ZPROF.ZSCHOLAR.LIB.SOURCE,操作过程如下: 

1. 选择ISPF选项3.3(实用程序移动/复制) 

2. 在第一个面板上: 

    在选项区域输入C 

    在数据集名字区域输入’ZPROF.ZSCHOLAR.LIB.SOURCE’。这种情况需要用到单引号 

3.在第二个面板上: 

    在数据集名字区域中输入’yourid.LIB.SOURCE’并且按ENTER ,如果这个目标数据集不存在,会有一个创建新数据集的提示。

4. 操作后应该产生一个面板列出输入数据集中的所有成员: 

     -在每个成员名字前输入S,并且按ENTER键。 如果源数据集中本身就没有成员,那么复制将自然会失败。

这样就把所有显示出来的成员从源数据集复制到了目标数据集。

移动的做法跟复制差不多,只是移动过后源数据集就消失了,而复制不会消失。

数据集的编目:

先对数据集的编目进行一个概览:

MVS中,数据集的管理主要是通过目录(CATALOG)来实现的。目录本身是一个数据集,它含有其它数据集的信息,提供一种能力,按数据集名去定位数据集的地址。MVS中最初没有目录,因此用户必须牢牢记住其数据集所在的卷,在访问数据集时,除了要指定数据集的名字外,还要指定数据集所在的卷。由于系统中的卷的个数非常多,用户使用很不方便。之后,随着操作系统的发展,实现了CVOL目录和VSAM目录。现在使用的目录是Integrated catalog
         这三种目录可以并存于同一个操作系统中,其中前两种只是因为考虑兼容性而存在,系统中如果没有早期的应用需求,可以完全不使用前两种目录 形式。

 对数据集的编目实际上是对数据集的入口建立表格和索引。访问数据集时,系统通过查找目录来定位已编目的数据集。目录中包括数据集名,卷标(VOLUME)和设备类型(UNIT)。
当读取编目的数据集时,只需指定数据集名和数据集状态,无需指定VOLUMEUNIT参数,这时,系统通过数据集名(DSN)查找编目,从编目中获取UNIT VOLUME信息,然后再通过UNIT参数和VOLUME参数指定的VTOC获取数据集位置,大小等信息。

 使用编目后,用户不再需要知道外存储器的详细设置,因此数据可以从一个地方移动到另一个地方而不必改变JCL中的DD语句,访问数据集时也不必知道数据集存放的卷。使用编目同时也简化了数据集的备份和恢复过程。所有VSAM数据集和SMS管理的数据集均需要编目。

如果你使用了SMS,或者为编目定义了别名(alias),则在JCL中不应该再使用JOBCATSTEPCAT语句去指定catalog

   一个编目机制包含两种独立的数据集:一个基本的编目结构(BCS)和一个VSAM卷数据集(VVDS)。BCS可以认为是编目,而VVDS则可认为是VTOC的扩展。

   BCS是一个VSAM KSDS数据集,它使用数据集的名字作为关键字。对于VSAM数据集,BCS含有卷、安全信息、拥有者及其它信息。对于非 VSAM数据集, BCS含有卷,拥有者及其它信息。

 VVDS是一个VSAM ESDS数据集,其名字为:SYSIVVDSVvolser VVDS存放在每
一个含有VSAMSMS管理的数据集的卷上。它含有数据集的特性和扩展(extention)信息。
对于VSAM数据集来说,还含有卷的有关信息。因此,编目的数据集描述信息包含在VTOCBCSVVDS中,三者描述的信息应当一致。这种一致性由操作系统自动同步。

 所有SMS管理的数据集在VVDS中都有登记项,对于VSAM数据集的VVDS记录被称之为VVRVSAM Volume Record),而对于SMS管理的非VSAM数据集的VVDS记录则被称之为NVRNon-VSAM Volume Record)。如果一个非VSAM数据集跨多个卷,则其NVR在第一个卷上。

由于BCS同样也是一个VSAM,它在 VVDS中也有一个VVR。临时的 VSAM数据集在VVDS中同样也有登记项,但在BCS中没有登记项。

  MVS系统中,有一个主目录(Master Catalog)及多个用户目录(User Catalog)
主目录是整个外存系统管理的中心控制点,它描述系统的数据集和用户目录,而用户目录则描述用户的数据集。通常称在目录中有描述信息的数据集为编目的数据集。显然,主目录的信息非常重要,因此可以有一个或多个主目录的备份。但任何时候系统中只能有一个主目录在使用,形成一个以主目录为中心的两级层次式的数据集管理方式,主目录与用户目录的区别仅仅在于它使用的方式。

 SYSINUCLEUS数据集的SYSCATXX成员(如果有的话)或SYSIPARMLIB(SYS1.IPLPARM)数据集的LOADXX成员指向主目录。在系统启动时,操作员也可指定使用另一个主目录。所有的用户目录均登记在主目录中。

posted @ 2012-03-31 15:59 Eric_jiang 阅读(2353) | 评论 (0)编辑 收藏

刷机前的准备:

(1)请开启调试功能,设置--应用程序--开发---USB调试 打钩

(2)请把signed-IT_radio.zip(基带)和 ROM (刷机包) 放到sd卡根目录,这里将会用  v大的2.3ROM示范
(3)安装moto驱动(刷机工具包中已带),最好重启下,这里安装驱动了刷机第一步  安装驱动跳过
(4)插入数据线后,手机会弹出 USB存储设备或仅充电,不要选择。
一、一步刷入recovery(1.5第一步开始,2.1以上直接看第三步)
先下载好ME600刷机工具,解压到桌面,运行开始智能破解.bat,看提示即可,第一步完成后手机会自动进入recovery的机器人界面  注:装驱动那步和最后不要忘记按任意键
如果执行命令的时候卡住了请关闭cmd窗口然后点亮手机屏幕重新开始  

二、刷基带(ATT请跳过此步,切记)
recovery下的操作方法:音量键选择,小房子确定,返回键返回

三、wipe all(清除数据)

对于买回来就是2.1以上的机友,或者以后想换其他2.1 2.2 2.3的包就从这里开始,这就就是所谓的平刷,手动进入recovery的方法是手机重启白屏的时候按住相机键,出现绿字了再按一下音量下键


四、刷包
刷包成功之后选择第一个reboot system now,手机会自动重启进入桌面,第一次进入桌面有点慢,五到十分钟左右 文章出处:安卓库
 
 
ME600刷机工具:http://u.115.com/file/clgm71ol

posted @ 2012-03-26 09:24 Eric_jiang 阅读(6448) | 评论 (0)编辑 收藏

Activities提供了一种方便管理的创建、保存、回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过getOwnerActivity()方法返回该Activity管理的对话框(dialog).

 

  onCreateDialog(int):当你使用这个回调函数时,Android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流。

 

  showDialog(int): 当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。

 

  onPrepareDialog(int, Dialog):在对话框被显示之前,Android还调用了可选的回调函数onPrepareDialog(int id, Dialog). 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用。如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。

 

  dismissDialog(int):当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。

 

下面是几种对话框的效果

图1

图2

图3

图4

图5

图6

图7

  图1效果:该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式。

     代码:

  创建对话框方法dialog()

protected void dialog() {
  AlertDialog.Builder builder = new Builder(Main.this);
  builder.setMessage("确认退出吗?");

  builder.setTitle("提示");

  builder.setPositiveButton("确认", new OnClickListener() {

   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();

    Main.this.finish();
   }
  });

  builder.setNegativeButton("取消", new OnClickListener() {

   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
   }
  });

  builder.create().show();
 }

 

在onKeyDown(int keyCode, KeyEvent event)方法中调用此方法

public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
   dialog();
  }
  return false;
 }

  图2效果:改变了对话框的图表,添加了三个按钮

Dialog dialog = new AlertDialog.Builder(this).setIcon(
     android.R.drawable.btn_star).setTitle("喜好调查").setMessage(
     "你喜欢李连杰的电影吗?").setPositiveButton("很喜欢",
     new OnClickListener() {

      @Override
      public void onClick(DialogInterface dialog, int which) {
       // TODO Auto-generated method stub
       Toast.makeText(Main.this, "我很喜欢他的电影。",
         Toast.LENGTH_LONG).show();
      }
     }).setNegativeButton("不喜欢", new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
     // TODO Auto-generated method stub
     Toast.makeText(Main.this, "我不喜欢他的电影。", Toast.LENGTH_LONG)
       .show();
    }
   }).setNeutralButton("一般", new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
     // TODO Auto-generated method stub
     Toast.makeText(Main.this, "谈不上喜欢不喜欢。", Toast.LENGTH_LONG)
       .show();
    }
   }).create();

   dialog.show();

 

图3效果:信息内容是一个简单的View类型

new AlertDialog.Builder(this).setTitle("请输入").setIcon(
     android.R.drawable.ic_dialog_info).setView(
     new EditText(this)).setPositiveButton("确定", null)
     .setNegativeButton("取消", null).show();

 

图4效果:信息内容是一组单选框

new AlertDialog.Builder(this).setTitle("复选框").setMultiChoiceItems(
     new String[] { "Item1", "Item2" }, null, null)
     .setPositiveButton("确定", null)
     .setNegativeButton("取消", null).show();

 

图5效果:信息内容是一组多选框

new AlertDialog.Builder(this).setTitle("单选框").setIcon(
     android.R.drawable.ic_dialog_info).setSingleChoiceItems(
     new String[] { "Item1", "Item2" }, 0,
     new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int which) {
       dialog.dismiss();
      }
     }).setNegativeButton("取消", null).show();

 

图6效果:信息内容是一组简单列表项

new AlertDialog.Builder(this).setTitle("列表框").setItems(
     new String[] { "Item1", "Item2" }, null).setNegativeButton(
     "确定", null).show();

 

图7效果:信息内容是一个自定义的布局

1.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_height="wrap_content" android:layout_width="wrap_content"
 android:background="#ffffffff" android:orientation="horizontal"
 android:id="@+id/dialog">
 <TextView android:layout_height="wrap_content"
   android:layout_width="wrap_content"
  android:id="@+id/tvname" android:text="姓名:" />
 <EditText android:layout_height="wrap_content"
  android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/>

</LinearLayout>

2.调用代码

LayoutInflater inflater = getLayoutInflater();
   View layout = inflater.inflate(R.layout.dialog,
     (ViewGroup) findViewById(R.id.dialog));

   new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout)
     .setPositiveButton("确定", null)
     .setNegativeButton("取消", null).show();

posted @ 2012-03-12 16:32 Eric_jiang 阅读(426) | 评论 (0)编辑 收藏

在非主Activity中点击下载按钮时,新建一个线程来下载文件。同时要在非主Activity中定义一个Handler来刷新下载进度。如果界面切到了主Activity界面,当文件下载完成后,非主Activity中的Handler仍会获得信息并处理。我选择在这时发送一个广播:

  

Handler handler 
= new Handler() {
        @Override
        
public void handleMessage(Message msg) {
            
if (msg.what == 1) {
             
int index= msg.getData().getInt("index");
          
if(index!=0){
           
//显示进度
          }
          
if(index>=100){
                 
if(当前是非主Activity){
                  
//隐藏进度,弹出下载完成提示
                 }else{
      
//给主Activity发送一个广播
                  Intent intent = new Intent("android.intent.action.MAIN");
         sendBroadcast(intent);
     }
          }
            }
        }
}; 



 同时,在主Activity中定义一个广播接收器,并处理


BroadcastReceiver mReceiver
=new BroadcastReceiver(){
 
public void onReceive(Context context, Intent intent) {
  
//刷新主Activity界面
  init();
 }
};
IntentFilter intentFilter 
= new IntentFilter("android.intent.action.MAIN");
registerReceiver(mReceiver, intentFilter);  
 


 
这样就实现我想要的功能。

posted @ 2012-03-08 17:30 Eric_jiang 阅读(3169) | 评论 (1)编辑 收藏

     摘要:   Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="htt...  阅读全文
posted @ 2012-02-29 19:16 Eric_jiang 阅读(23243) | 评论 (2)编辑 收藏

Intent用法实例

1.无参数Activity跳转

Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);   

2.向下一个Activity传递数据(使用Bundle和Intent.putExtras)

Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle);       // it.putExtra(“test”, "shuju”);
startActivity(it);            // startActivityForResult(it,REQUEST_CODE);

对于数据的获取可以采用:

Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

3.向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)

        Intent intent=getIntent();
        Bundle bundle2=new Bundle();
        bundle2.putString("name", "This is from ShowMsg!");
        intent.putExtras(bundle2);
        setResult(RESULT_OK, intent);
4.回调上一个Activity的结果处理函数(onActivityResult)
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==REQUEST_CODE){
            if(resultCode==RESULT_CANCELED)
                  setTitle("cancle");
            else if (resultCode==RESULT_OK) {
                 String temp=null;
                 Bundle bundle=data.getExtras();
                 if(bundle!=null)   temp=bundle.getString("name");
                 setTitle(temp);
            }
        }
    }

posted @ 2012-02-29 17:29 Eric_jiang 阅读(671) | 评论 (0)编辑 收藏

LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。他们的区别在于:android:gravity用于设置View组件的对齐方式,而android:layout_gravity用于设置Container组件的对齐方式。

举个例子,我们可以通过设置android:gravity="center"来让EditText中的文字在EditText组件中居中显示;同时我们设置EditText的android:layout_gravity="right"来让EditText组件在LinearLayout中居中显示。来实践以下:


正如我们所看到的,在EditText中,其中的文字已经居中显示了,而EditText组件自己也对齐到了LinearLayout的右侧。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <EditText
        android:layout_width="wrap_content"
        android:gravity="center"
        android:layout_height="wrap_content"
        android:text="one"
        android:layout_gravity="right"/>
</LinearLayout>

posted @ 2012-02-29 17:16 Eric_jiang 阅读(410) | 评论 (0)编辑 收藏

package www.puyufanyi.com;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import www.puyufanyi.com.test.Word;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.widget.TextView;

public class UIActivity extends Activity{

    
private ArrayList<Word> words = new ArrayList<Word>();

    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ListView lv
= (ListView)findViewById(R.id.wordlist);
         
        Word word1 
= new Word("index1""result1");
        Word word2 
= new Word("index2""result2");
        Word word3 
= new Word("index3""result3");
        Word word4 
= new Word("index4""result4");
        Word word5 
= new Word("index5""result5");
        
this.words.add(word1);
        
this.words.add(word2);
        
this.words.add(word3);
        
this.words.add(word4);
        
this.words.add(word5);

        List
<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();

        
for (int i = 0; i < words.size(); i++{
            Map
<String, Object> listItem = new HashMap<String, Object>();
            listItem.put(
"Index", words.get(i).getIndex());
            listItem.put(
"Result", words.get(i).getResult());
            listItems.add(listItem);
        }

        SimpleAdapter simpleAdapter 
= new SimpleAdapter(
                
this
                listItems, 
                R.layout.words,
                
new String[]{"Index","Result"},
                
new int[]{R.id.index,R.id.result}
        );
        lv.setAdapter(simpleAdapter);
        lv.setOnItemClickListener(
new OnItemClickListener() {
            
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                 String  indexValue 
= ((TextView)view.findViewById(R.id.index)).getText().toString();
                 Toast.makeText(getApplicationContext(), indexValue, Toast.LENGTH_SHORT).show();    
            }
  
        }
);
        
             
     }

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- ListView (words) -->

    <ListView
        android:id="@+id/wordlist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

words.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/index"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp" />

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp" />

</LinearLayout>








posted @ 2012-02-29 16:41 Eric_jiang 阅读(290) | 评论 (1)编辑 收藏

仅列出标题
共57页: First 上一页 31 32 33 34 35 36 37 38 39 下一页 Last