9/6/2011 10:06:34 AM

 

9/6/2011 10:06:34 AM

第3方组件的调用
@echo off
if "%JAVA_HOME%" == ""  set JAVA_HOME=C:\j2sdk1.4.1_03
if "%CATALINA_HOME%" == ""  set CATALINA_HOME=C:\tools\tomcat5.0.30
if "%RUN_HOME%" == ""  set RUN_HOME=runtime
if "%COMPONENT_WEB_HOME%" == ""  set COMPONENT_WEB_HOME=..\Component\webplatform\software_wp

需要安装一下插件

现在用的1.6的版本

C:\Program Files\Common Files\NetSarang;
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
D:\software\UltraEdit-32;D:\software\ClearCase\common;
D:\software\ClearCase\ClearCase\bin;
C:\WINDOWS\system32\WindowsPowerShell\v1.0;
D:\software\TortoiseSVN\bin;
I:\MinGW\libexec\gcc\mingw32\4.5.2;
I:\MinGW\bin;D:\software\Tunnelier


<%@ page import="com.amplesky.product.mc.ui.struts.ActionHelper" %>
<%
 String port = ActionHelper.getRequestPort(request);
 String str = "";
 if (!"80".equals(port))
 {
  str = ":" + port;
 }
 response.sendRedirect("/logonPhoneAction.do?action=showPhone&u=" + request.getParameter("u") + "&p=" + request.getParameter("p") + "&isEncrypt=" + request.getParameter("isEncrypt"));
%>

Constants

定义了一些常量

DetectCfgFile

检测执行配置文件

copyMysqlData  打包

zipFile 日志打包

addEncoderCFG  读取产品信息文件中得内容

hasFileDownloadSQLFile FileDownload.sql 数据库是否存在

getFileDownloadSQLFilePath 获取

下载平台的代码 进行关联一下


加入一个listview

1.<?xml version="1.0" encoding="utf-8"?> 
2.<LinearLayout   
3.    android:id="@+id/LinearLayout01"   
4.    android:layout_width="fill_parent"   
5.    android:layout_height="fill_parent"   
6.    xmlns:android="http://schemas.android.com/apk/res/android"> 
7.<ListView android:layout_width="wrap_content"   
8.          android:layout_height="wrap_content"   
9.          android:id="@+id/ListView01" 
10.          /> 
11.</LinearLayout> 

 

1.<?xml version="1.0" encoding="utf-8"?> 
2.<RelativeLayout   
3.    android:id="@+id/RelativeLayout01"   
4.    android:layout_width="fill_parent"   
5.    xmlns:android="http://schemas.android.com/apk/res/android"   
6.    android:layout_height="wrap_content"   
7.    android:paddingBottom="4dip"   
8.    android:paddingLeft="12dip" 
9.    android:paddingRight="12dip"> 
10.<ImageView   
11.    android:paddingTop="12dip" 
12.    android:layout_alignParentRight="true" 
13.    android:layout_width="wrap_content"   
14.    android:layout_height="wrap_content"   
15.    android:id="@+id/ItemImage" 
16.    />   
17.<TextView   
18.    android:text="TextView01"   
19.    android:layout_height="wrap_content"   
20.    android:textSize="20dip"   
21.    android:layout_width="fill_parent"   
22.    android:id="@+id/ItemTitle" 
23.    /> 
24.<TextView   
25.    android:text="TextView02"   
26.    android:layout_height="wrap_content"   
27.    android:layout_width="fill_parent"   
28.    android:layout_below="@+id/ItemTitle"   
29.    android:id="@+id/ItemText" 
30.    /> 
31.</RelativeLayout> 

关联布局


1.package com.ray.test;  
2. 
3.import java.util.ArrayList;  
4.import java.util.HashMap;  
5. 
6.import android.app.Activity;  
7.import android.os.Bundle;  
8.import android.view.ContextMenu;  
9.import android.view.MenuItem;  
10.import android.view.View;  
11.import android.view.ContextMenu.ContextMenuInfo;  
12.import android.view.View.OnCreateContextMenuListener;  
13.import android.widget.AdapterView;  
14.import android.widget.ListView;  
15.import android.widget.SimpleAdapter;  
16.import android.widget.AdapterView.OnItemClickListener;  
17. 
18.public class TestListView extends Activity {  
19.    @Override 
20.    public void onCreate(Bundle savedInstanceState) {  
21.        super.onCreate(savedInstanceState);  
22.        setContentView(R.layout.main);  
23.        //绑定Layout里面的ListView  
24.        ListView list = (ListView) findViewById(R.id.ListView01);                  
           找到listview
25.          
26.        //生成动态数组,加入数据  
27.        ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
           申明一个ArrayList
     
28.        for(int i=0;i<10;i++)  
29.        {  
30.            HashMap<String, Object> map = new HashMap<String, Object>();  
31.            map.put("ItemImage", R.drawable.checked);//图像资源的ID  
32.            map.put("ItemTitle", "Level "+i);  
33.            map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves! ");  
34.            listItem.add(map);  
35.        }  
           在这个list中放入了10个元素
                
36.        //生成适配器的Item和动态数组对应的元素  
37.        SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,//数据源   
38.            R.layout.list_items,//ListItem的XML实现  
39.            //动态数组与ImageItem对应的子项          
40.            new String[] {"ItemImage","ItemTitle", "ItemText"},   
41.            //ImageItem的XML文件里面的一个ImageView,两个TextView ID  
42.            new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}  
43.        );  
44.         
45.        //添加并且显示  
46.        list.setAdapter(listItemAdapter);  
47.          
48.        //添加点击  
49.        list.setOnItemClickListener(new OnItemClickListener() {  
50. 
51.            @Override 
52.            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
53.                    long arg3) {  
54.                setTitle("点击第"+arg2+"个项目");  
55.            }  
56.        });  
57.          
58.      //添加长按点击  
59.        list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {  
60.              
61.            @Override 
62.            public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {  
63.                menu.setHeaderTitle("长按菜单-ContextMenu");     
64.                menu.add(0, 0, 0, "弹出长按菜单0");  
65.                menu.add(0, 1, 0, "弹出长按菜单1");     
66.            }  
67.        });   
68.    }  
69.      
70.    //长按菜单响应函数  
71.    @Override 
72.    public boolean onContextItemSelected(MenuItem item) {  
73.        setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目");   
74.        return super.onContextItemSelected(item);  
75.    }  
76.} 


//显示一个listView的菜单 先显示一个

今天就在获取一下设备列表

 

Eclipse快捷键大全(转载)
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)

编辑
作用域 功能 快捷键
全局 查找并替换 Ctrl+F
文本编辑器 查找上一个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space
Java编辑器 显示工具提示描述 F2
Java编辑器 选择封装元素 Alt+Shift+↑
Java编辑器 选择上一个元素 Alt+Shift+←
Java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y

 
查看
作用域 功能 快捷键
全局 放大 Ctrl+=
全局 缩小 Ctrl+-

 
窗口
作用域 功能 快捷键
全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-

 
导航
作用域 功能 快捷键
Java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
Java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
Java编辑器 转至上一个成员 Ctrl+Shift+↑
Java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至行 Ctrl+L

 
搜索
作用域 功能 快捷键
全局 出现在文件中 Ctrl+Shift+U
全局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G

 
文本编辑
作用域 功能 快捷键
文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下滚行 Ctrl+↓

 
文件
作用域 功能 快捷键
全局 保存 Ctrl+X
Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N

 
项目
作用域 功能 快捷键
全局 全部构建 Ctrl+B

 
源代码
作用域 功能 快捷键
Java编辑器 格式化 Ctrl+Shift+F
Java编辑器 取消注释 Ctrl+\
Java编辑器 注释 Ctrl+/
Java编辑器 添加导入 Ctrl+Shift+M
Java编辑器 组织导入 Ctrl+Shift+O
Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。
也可以使用Ctrl+1自动修正。

 
运行
作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行至行 Ctrl+R
全局 执行 Ctrl+U

 
重构
作用域 功能 快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y

注意F5 F6 F7 F8 的用途

MXManager 启动一个RTSPServer

开启日志
日志开启失败

如果工作目录是产品目录  默认不开启日志功能
现在看一下3G是怎么注册的?
起个串口 看看输出
关闭平台
请问有什么问题

 

在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service.
在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 跨进程使用

因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的.

在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.

 AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,

通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象,

需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情:

1. 引入AIDL的相关类.;

2. 调用aidl产生的class.

 

具体实现步骤如下:

1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 如: ITaskBinder.adil

package com.cmcc.demo;
import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
boolean isTaskRunning();
void stopRunningTask();
void registerCallback(ITaskCallback cb);
void unregisterCallback(ITaskCallback cb); }

接口
注册了一个回调
其中: ITaskCallback在文件ITaskCallback.aidl中定义:
package com.cmcc.demo;
interface ITaskCallback {
void actionPerformed(int actionId); }

注意: 理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类,
参数类型
int string bundle
不过在Eclipse中,目前的ADT不支持Bundle做为参数, 据说用Ant编译可以, 我没做尝试.

2、编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.
怎么产生的?

 adil文件

3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。
这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.
根据stub类产生接口类

 


ITaskBinder.aidl中接口的实现, 在MyService.java中接口以内嵌类的方式实现:

private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub()
{
public void stopRunningTask() { //@TODO }
public boolean isTaskRunning() { //@TODO return false; }
public void registerCallback(ITaskCallback cb)
{
  if (cb != null) mCallbacks.register(cb);
 }
 public void unregisterCallback(ITaskCallback cb)
 { if (cb != null) mCallbacks.unregister(cb);
 }
};

在MyActivity.java中ITaskCallback.aidl接口实现:
private ITaskCallback mCallback = new ITaskCallback.Stub() {
public void actionPerformed(int id) { //TODO printf("callback id=" + id); } };


4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。

 这个地方返回的mBinder,就是上面通过内嵌了定义的那个. (MyService.java)
 
public IBinder onBind(Intent t) { printf("service on bind"); return mBinder; }

在Activity中, 可以通过Binder定义的接口, 来进行远程调用.

5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数在:MyService.java中:

void callback(int val)
 { final int N = mCallbacks.beginBroadcast();
 
  for (int i=0; i<N; i++) { try { mCallbacks.getBroadcastItem(i).actionPerformed(val); }
   catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } }
   mCallbacks.finishBroadcast(); }
  
AIDL的创建方法:
AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。
由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

1. 不需要import声明的简单Java编程语言类型(int,boolean等)

2. String, CharSequence不需要特殊声明

3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.
(
(另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).
下面是AIDL语法:
// 文件名: SomeClass.aidl // 文件可以有注释, 跟java的一样 // 在package以前的注释, 将会被忽略. // 函数和变量以前的注释, 都会被加入到生产java代码中. package com.cmcc.demo;
// import 引入语句 import com.cmcc.demo.ITaskCallback;

interface ITaskBinder {
//函数跟java一样, 可以有0到多个参数 ,可以有一个返回值 boolean isTaskRunning();
void stopRunningTask(); //参数可以是另外的一个aidl定义的接口 void registerCallback(ITaskCallback cb);
void unregisterCallback(ITaskCallback cb);
//参数可以是String, 可以用in表入输入类型, out表示输出类型.
int getCustomerList(in String branch, out String customerList);
}

 

实现接口时有几个原则:
.抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的.
.IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。
 也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理.
  同步调用
.不能在AIDL接口中声明静态属性。
IPC的调用步骤:
1.声明一个接口类型的变量,该接口类型在.aidl文件中定义。
2. 实现ServiceConnection。 服务连接
3. 调用ApplicationContext.bindService(),
   并在ServiceConnection实现中进行传递.
4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).
  
   调用 YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。
5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。
6. 断开连接,调用接口实例中的ApplicationContext.unbindService()


下面是整个程序:
1. ITaskCallback.aidl

package com.cmcc.demo;

interface ITaskCallback {
void actionPerformed(int actionId); }   回调申明

2. ITaskBinder.aidl
package com.cmcc.demo;

import com.cmcc.demo.ITaskCallback;   
interface ITaskBinder {
boolean isTaskRunning();
void stopRunningTask();
void registerCallback(ITaskCallback cb);
void unregisterCallback(ITaskCallback cb); }

3. MyService.java
package com.cmcc.demo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;

public class MyService extends Service {

@Override
  public void onCreate() { printf("service create"); }
@Override
   public void onStart(Intent intent, int startId) 
    { printf("service start id=" + startId); callback(startId); }
        
@Override

 public IBinder onBind(Intent t) { printf("service on bind"); return mBinder; }
@Override public void onDestroy() { printf("service on destroy"); super.onDestroy(); }
@Override public boolean onUnbind(Intent intent) { printf("service on unbind"); return super.onUnbind(intent); }
public void onRebind(Intent intent) { printf("service on rebind"); super.onRebind(intent); }
private void printf(String str) { Log.e("TAG", "###################------ " + str + "------"); }
void callback(int val) { final int N = mCallbacks.beginBroadcast(); for (int i=0; i<N; i++) { try { mCallbacks.getBroadcastItem(i).actionPerformed(val); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } mCallbacks.finishBroadcast(); }
private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() { public void stopRunningTask() {
}
public boolean isTaskRunning() { return false; }
public void registerCallback(ITaskCallback cb) { if (cb != null) mCallbacks.register(cb); } public void unregisterCallback(ITaskCallback cb) { if (cb != null) mCallbacks.unregister(cb); } };
final RemoteCallbackList
<itaskcallback>mCallbacks = new RemoteCallbackList
<itaskcallback>(); }

4. MyActivity.java
package com.cmcc.demo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Color;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;

public class MyActivity extends Activity {

private Button btnOk; private Button btnCancel;
@Override public void onCreate(Bundle icicle) { super.onCreate(icicle);
setContentView(R.layout.test_service);
btnOk = (Button)findViewById(R.id.btn_ok); btnCancel = (Button)findViewById(R.id.btn_cancel);
btnOk.setText("Start Service"); btnCancel.setTag("Stop Service");
btnOk.setOnClickListener(new OnClickListener() { public void onClick(View v) { onOkClick(); } });
btnCancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { onCancelClick(); } }); }
void onOkClick() { Bundle args = new Bundle();
Intent intent = new Intent(this, MyService.class); intent.putExtras(args);
//printf("send intent to start");
//startService(intent); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); startService(intent); }
void onCancelClick() { Intent intent = new Intent(this, MyService.class); //printf("send intent to stop");
unbindService(mConnection); //stopService(intent); }
private void printf(String str) { Log.e("TAG", "###################------ " + str + "------"); }
ITaskBinder mService;
private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mService = ITaskBinder.Stub.asInterface(service); try { mService.registerCallback(mCallback); } catch (RemoteException e) { }
}
public void onServiceDisconnected(ComponentName className) { mService = null; } };
private ITaskCallback mCallback = new ITaskCallback.Stub() { public void actionPerformed(int id) { printf("callback id=" + id); } }; }

5. xml文件(略)

点击事件  

从结构体数组找到对应的消息处理函数

 


 近期很多Android开发者来函表示对ArrayAdapter和BaseAdapter的区别不是很清楚,
 
 这里Android123简单说下他们的关系和用处,ArrayAdapter是从BaseAdapter派生出来的,具备BaseAdapter的所有功能,
 
 但ArrayAdapter更为强大,它实例化时可以直接使用泛型构造,我们在Android SDK中可以看到android.widget.ArrayAdapter<T>的字样,
 
 当然也可以使用 ArrayAdapter(Context context, int textViewResourceId) 第二个参数直接绑定一个layout,下文的例子我们使用Java泛型实例化。
 
 
 java 泛型
 
通过Adapter我们构造一个支持icon的item,下面我们在getView中使用的是imageView显示图片,当然android123提示大家其实TextView也可以直接绑定一个drawable对象显示的,

void  setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)

或void  setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom) 和

void  setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)

textView 如何绑定drawable

即可,其中第二种的int类型指定的资源id,方位则是textview什么位置显示drawable对象


说了这么多ArrayAdapater一起看个例子,来实例化ArrayAdapter吧,我们可以修改Res/layout/icon_list_item.xml文件来实现自定义显示效果。

Java代码 
1.public class IconListAdapter extends ArrayAdapter<IconListAdapter.IconListItem> {  
2.    protected LayoutInflater mInflater;  
3.    private static final int mResource = R.layout.icon_list_item; //xml布局文件  
4. 
5.    public IconListAdapter(Context context,  
6.            List<IconListItem> items) {  
7.        super(context, mResource, items);  
8.        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
9.    }  
10. 
11.    @Override 
12.    public View getView(int position, View convertView, ViewGroup parent) {  
13.        TextView text;  
14.        ImageView image;  
15. 
16.        View view;  
17.        if (convertView == null) {  
18.            view = mInflater.inflate(mResource, parent, false);  
19.        } else {  
20.            view = convertView;  
21.        }  
22. 
23.        text = (TextView) view.findViewById(R.id.text1);  
24.        text.setText(getItem(position).getTitle());  
25. 
26.        image = (ImageView) view.findViewById(R.id.icon);  //可以使用上文说的三种方法,直接用TextView类的setCompoundDrawables等方法绑定图标显示  
27.        image.setImageResource(getItem(position).getResource());  
28. 
29.        return view;  
30.    }  
31. 
32.    public static class IconListItem {  //每条显示的构造方法  
33.        private final String mTitle;  
34.        private final int mResource;  
35. 
36.        public IconListItem(String title, int resource) {  
37.            mResource = resource;  
38.            mTitle = title;  
39.        }  
40. 
41.        public String getTitle() {  
42.            return mTitle;  
43.        }  
44. 
45.        public int getResource() {  
46.            return mResource;  
47.        }  
48.    }  
49.} 
public class IconListAdapter extends ArrayAdapter<IconListAdapter.IconListItem> {
    protected LayoutInflater mInflater;
    private static final int mResource = R.layout.icon_list_item; //xml布局文件

    public IconListAdapter(Context context,
            List<IconListItem> items) {
        super(context, mResource, items);
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView text;
        ImageView image;

        View view;
        if (convertView == null) {
            view = mInflater.inflate(mResource, parent, false);
        } else {
            view = convertView;
        }

        text = (TextView) view.findViewById(R.id.text1);
        text.setText(getItem(position).getTitle());

        image = (ImageView) view.findViewById(R.id.icon);  //可以使用上文说的三种方法,直接用TextView类的setCompoundDrawables等方法绑定图标显示
        image.setImageResource(getItem(position).getResource());

        return view;
    }

    public static class IconListItem {  //每条显示的构造方法
        private final String mTitle;
        private final int mResource;

        public IconListItem(String title, int resource) {
            mResource = resource;
            mTitle = title;
        }

        public String getTitle() {
            return mTitle;
        }

        public int getResource() {
            return mResource;
        }
    }
}

当然对于ArrayAdapter到底比BaseAdapter先进到哪里呢?  从名称来看Array我们可以联系到数组的很多操作,没错Android123给大家列出本类所有成员方法实用的处理方式,比如:

Java代码 
1.void  add(T object)  //添加一个对象到本ArrayAdapter  
2. 
3.void  clear()  //清除所有元素  
4. 
5.static ArrayAdapter<CharSequence>  createFromResource(Context context, int textArrayResId, int textViewResId)  //从layout资源构造arrayadapter  
6. 
7.Context  getContext()  //获取实例  
8. 
9.int  getCount()   
10. 
11.View  getDropDownView(int position, View convertView, ViewGroup parent)  //获取drop down的popup风格选择条目的内容,参数1是位置,参数2可以通过强制转换直接获取本条的内容  
12. 
13.Filter  getFilter() //使用正则过滤数据   
14. 
15.T  getItem(int position)  //获取单条内容  
16. 
17.long  getItemId(int position)    
18. 
19.int  getPosition(T item) //通过内容获取是某条  
20. 
21.View  getView(int position, View convertView, ViewGroup parent)   
22. 
23.void  insert(T object, int index)  //插入新条目到数组的index位置  
24. 
25.void  notifyDataSetChanged()  //通知数据变化了,告诉绑定Adapter的widget来更新UI  
26. 
27.void  remove(T object)  //移出一条从数组,这里并没有指定位置  
28. 
29.void  setDropDownViewResource(int resource)  //设置dropdown的layout风格  
30.Sets the layout resource to create the drop down views.  
31. 
32.void  setNotifyOnChange(boolean notifyOnChange)  //本条是arrayadapter最强大的功能,android123强烈推荐处理大数据时使用该方法,可以降低ui的处理量,刷新ui可以更快速,主要可以停止对  
33.(add(T), insert(T, int), remove(T), clear() 的操作,当然可以通过 notifyDataSetChanged(). 或 setNotifyOnChange(true) 通知变化  
34. 
35.void  sort(Comparator<? super T> comparator)  //这里是android开发网经常用的排序,使用arrayadapter可以直接排序,十分方便 
void  add(T object)  //添加一个对象到本ArrayAdapter

void  clear()  //清除所有元素

static ArrayAdapter<CharSequence>  createFromResource(Context context, int textArrayResId, int textViewResId)  //从layout资源构造arrayadapter

Context  getContext()  //获取实例

int  getCount()

View  getDropDownView(int position, View convertView, ViewGroup parent)  //获取drop down的popup风格选择条目的内容,参数1是位置,参数2可以通过强制转换直接获取本条的内容

Filter  getFilter() //使用正则过滤数据

T  getItem(int position)  //获取单条内容

long  getItemId(int position) 

int  getPosition(T item) //通过内容获取是某条

View  getView(int position, View convertView, ViewGroup parent)

void  insert(T object, int index)  //插入新条目到数组的index位置

void  notifyDataSetChanged()  //通知数据变化了,告诉绑定Adapter的widget来更新UI

void  remove(T object)  //移出一条从数组,这里并没有指定位置

void  setDropDownViewResource(int resource)  //设置dropdown的layout风格
Sets the layout resource to create the drop down views.

void  setNotifyOnChange(boolean notifyOnChange)  //本条是arrayadapter最强大的功能,android123强烈推荐处理大数据时使用该方法,可以降低ui的处理量,刷新ui可以更快速,主要可以停止对
(add(T), insert(T, int), remove(T), clear() 的操作,当然可以通过 notifyDataSetChanged(). 或 setNotifyOnChange(true) 通知变化

void  sort(Comparator<? super T> comparator)  //这里是android开发网经常用的排序,使用arrayadapter可以直接排序,十分方便

所以最终android123推荐大家什么情况使用arrayadapter,什么时候使用baseadapter。当数量较多,比如超过100条或频繁动态增减时使用arrayadapter可以方便控制ui,通过setNotifyOnChanage方法,如果比较简单仅仅呈现直接从 baseadapter更节省资源。


HTTP协议和RTSP协议
GET WAP协议


GET /logonPhoneAction.do?action=showPhone&u=null&p=null&isEncrypt=null HTTP/1.1\r\n

logonPhoneAction.do 怎么到的MC

获取了用户名和密码
structs 结构


 首先,你要照书本或者网上的例子跑一个最简单的Struts应用,就是在客户端显示一个HELLOWORLD的那种,这叫先睹为快。在这里你开始接触到做Struts应用需要的东西:

Struts的JAR包,核心控制器ActionServlet在web.xml上的配置,针对具体用户请求URL的Action的编写以及Struts应用的核心配置文件Struts-config.xml。

做完后停下来思考一下。

然后,你开始跑一个稍微大点的用户登陆的应用,成功就跳转到我们的主页面,失败就继续回到登陆页面。我们引入ActionForm组件和对后台数据库的操作。

这个时候MVC发挥作用了。ActionServlet和自己编写的Action分别充当前,后端控制器组件,DAO/DTO充当了模型组件,JSP充当视图组件。Struts-config.xml也变的饱满起来,

上面开始多了些配置datasources,form-beans,action-mappings。做完后到网上找一些好的参考资料或者利用自己经典的Struts的案头书(最好是有图解),


开始认真琢磨Struts的运行原理和执行流程,特别要好生体会ActionForm组件的作用和Struts-config.xml这个核心配置文件每一处用到的配置。这个时候,

你应该开始有些领悟:我们自己写的Action还有ActionForm类一定要继承框架已有的Action和ActionForm,写完了之后还必须得将它们配置到Struts-config.xml中去。

接着,你已经对Struts框架有了大致的了解,可能开始对Struts的其他主题感兴趣了,OK,现在扩充你的登陆应用吧。先加上验证,不然你的系统会不堪一击。

验证分为客户端验证和服务器端验证。服务器端的验证我们可以在ActionForm里面的validate()方法里做,

也可以在随后的Action类的execute()方法里做,甚至可以使用验证框架。这里大家要把重点方在验证框架的学习上。做好后再加上资源国际化I18N

,针对不同区域不同语言的客户提供不同语言版本的页面显示。我们开始写资源属性文件,开始在Struts-config.xml里面配置,开始使用Struts自带的标签,等。

这个里面涉及的知识点都很多,需要大家耐心细致地学习。大家在跑这个应用的时候会发现各种各样的异常和问题。不要害怕,这些错误都是我们的好朋友,

我们要把它们通通都记录下来,并坚韧地排除掉它们。这里要记住:尽量避免重复犯错,不要在同一个地方跌倒两次。

form-beans 和全局映射

 

再接着,你把上面的都基本消化了,但是总隐隐觉得不够系统和完整,你就开始做几个CRUD的应用,完成普通的增删查改的工作。在做这些应用的过程中,

你要认真总结核心配置文件Struts-config.xml里面的8个重要节点元素的配置以及它们的顺序,每个节点的重要属性,特别是里的子节点的属性是重中之重,

一定要好好理解并灵活运用。

你也要开始系统地学习Struts里面的标签。但这个时候千万不要追求大而全,只学习几种常用的标签就可以了,重点放在html,bean,还有logic标签上。

这时候还有些小知识点你也许要用到,譬如:文件上传控件,防止信息重复提交 ,自定义标签,cookie的使用等等。这就是个相对比较耗时间和精力的阶段了,


你要做的就是不断地参考,不断地思考,不断地总结,最好还能和志同道合的人不断地争论。

慢慢地,你对Struts框架有了一个全局性的宏观把握,用它来完成一些小模块的开发已经没有太大问题,你已经开始志得意满了:Struts不过如此嘛!如果你到了这一步,

我首先要恭喜你,你接近成功了。但我也要小心地提醒你:Struts里面还有很多东西值得挖掘!你不妨多问一下自己,软件有一个人开发的吗?页面我使用了良好的布局吗?

页面导航都是那么简单吗?我的所有做法就不能有更简单的实现了吗?我对学习Struts框架的好处了如指掌了吗?好的,如果你想通了,带着这些问题,你就会重新披挂上阵,

开始学习Struts的多模块开发,开始学习tiles框架,开始认真研读Struts的源代码,开始学习一些更简单有效的Action组件类和ActionForm组件类……,真应了一句古语:

吾生也有涯,知也无涯!最后呢,大家可能会悟出一些道理:譬如Struts框架基本的好处就是用配置代替编码,它是一个半成品,是让我们扩展和配置的等等。


上面我粗略地勾勒了一下学习Struts的曲线。归纳一下:学习框架需要循序渐进,实例驱动,思考总结。实际上,我在做培训的过程中发现,

如果我们在学习Struts之前,自己动手写过一个简易的MVC框架,学习Struts将会非常轻松,大概只需要五天的时间,而且可以学的非常好。

大家不要认为框架就是很庞大很复杂的怪兽,自己绝对无法写出来。其实,无非就是将我们所理解的朴素思想用代码实现出来罢了。

AbstractAction 继承 dispatch action

setResponseHeader 设置了响应头

checkUserLogon

1 从request中获取HttpSession  execute actionmapping和actionforward

 public void setResponseHeader(HttpServletResponse response)
 {
  // forbid cache the page
  response.setHeader("Pragma", "no-cache");
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expires", 0);
  response.setContentType("text/html; charset=UTF-8");
  // response.setCharacterEncoding("UTF-8");
 }
 
 设置响应头
 
 
  public boolean isNewSession(HttpSession session)
 {
  if (session.getAttribute(Constants.isNewSession) == null
    || "true".equals(session.getAttribute(Constants.isNewSession)))
  {
   session.setAttribute(Constants.isNewSession, "false");
   return true;
  }
  else
  {
   return false;
  }
 }
 
 是不是新的session的
 
 如果是就是返回true ,置值,如果不是就是返回false
 
 processLocaleLanguage
 
 如果是新的localeLanguage 就需要进行处理
 
 持久化的对象
 
 设置响应头 处理语言 加载产品信息
 
 DispatchAction
 
 所有的东西都继承自DispatchAction
 
 你的超时时间设置成24小时
 
 UIFTreeNodeManager 树节点管理是单例
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值