[转载]jquery插件之无缝循环新闻列表

mikel阅读(1044)

[转载]jquery插件之无缝循环新闻列表 – waitingbar – 博客园.

一、效果图:

newslist效果图

tips源码下载:http://files.cnblogs.com/waitingbar/newslist.rar

二、JQuery源码:

01 (function($){
02 $.fn.extend({
03 newsList:function(options){
04 var defaults ={
05 actName:'li', //显示条数名;
06 maxShowNum:'6', //最多的显示条数;
07 actNameH:'28', //一次移动的距离;
08 ulClass:'.ul_news_list', //被复制层的class
09 copyUlClass:'.ul_news_list2', //复制层的class
10 autoTime:'1500', //自动运行时间;
11 clickGoUpC:'.go_uplist', //点击向上class;
12 clickDownUpC:'.go_downlist', //点击向下class;
13 goStart:'go_tart',
14 autoCloss:'flase' //自动运行开关,当为'flase'时为开,其它则关;
15 } ;
16
17 options = $.extend(defaults, options);
18 return this.each(function(){
19 var o = options;
20 var counts =1;
21 var linum = $($(this).find(o.actName),$(this)).size();
22 var ul_class = $($(this).find(o.ulClass),$(this));
23 var copy_ul_class = $($(this).find(o.copyUlClass),$(this));
24 var click_go_up_c = $($(this).find(o.clickGoUpC),$(this));
25 var click_go_down_C = $($(this).find(o.clickDownUpC),$(this));
26 var go_start = $($(this).find(o.goStart),$(this));
27 if(linum > o.maxShowNum){
28 $(copy_ul_class).html($(ul_class).html());
29 goStartList();
30 }
31 var thiswrap = $($(ul_class).parent().parent(),$(this));
32 //自动运行函数
33 function auto_function(){
34 if(counts <= linum){
35 $(ul_class).animate({top:'-=' + o.actNameH},o.autoTime);
36 $(copy_ul_class).animate({top:'-=' + o.actNameH},o.autoTime);
37 counts++;
38 }else{
39 $(ul_class).animate({top:0},0);
40 $(copy_ul_class).animate({top:0},0);
41 counts = 1;
42 }
43 }
44 //点击向上移动时;
45 if(linum > o.maxShowNum){
46 $(click_go_up_c).click(function(){
47 if(counts <= linum){
48 $(ul_class).animate({top:'-=' + o.actNameH},0);
49 $(copy_ul_class).animate({top:'-=' + o.actNameH},0);
50 counts++;
51 }else{
52 $(ul_class).animate({top:0},0);
53 $(copy_ul_class).animate({top:0},0);
54 counts = 1;
55 }
56 });
57 }
58 //点击向下移动时;
59 if(linum > o.maxShowNum){
60 $(click_go_down_C).click(function(){
61 if(counts > 1){
62 counts--;
63 $(ul_class).animate({top:'-'+ counts*o.actNameH},0);
64 $(copy_ul_class).animate({top:'-'+ counts*o.actNameH},0);
65 }else{
66 $(ul_class).animate({top:0},0);
67 $(copy_ul_class).animate({top:0},0);
68 counts = linum+1;
69 }
70 });
71 }
72 //鼠标经过所发生的开始停止;
73 if(linum > o.maxShowNum){
74 $(thiswrap).hover(function(){
75 goStopList();
76 },function(){
77 goStartList();
78 });
79 }
80 function goStartList(){
81 if(o.autoCloss === 'flase'){
82 go_start = setInterval(auto_function,o.autoTime);
83 }
84 }
85 function goStopList(){
86 clearInterval(go_start);
87 }
88 });
89 }
90 });
91 }(JQuery));

三、HTML:

<script language=”JavaScript”>
$(document).ready(function(){
$(“#newslist”).newsList();
});
</script>

<div id=”newslist”>
<div class=”go_upanddown”><span class=”go_uplist”><img src=”images/newslist/goupbtn.gif” /></span><span class=”go_downlist”><img src=”images/newslist/godownbtn.gif” /></span></div>
<div class=”news_list_bar”>
<ul class=”ul_news_list”>
<li><a href=”#”>1、曾参加过唐山、汶川、玉树地震救援的援</a><a href=”#”>曾参加过唐,又来到了舟曲参加救援</a></li>
<li><a href=”#”>2、摩洛哥塞拉,艺术家在一场为流浪儿童为流浪儿童为流浪儿童为流浪儿童募捐的马戏节目中表演</a></li>
<li><a href=”#”>3、昆明警方近日县的“洪兴甸县的“洪兴甸县的“洪兴甸县的“洪兴帮”黑恶势力团伙,缴获…</a></li>
<li><a href=”#”>4、印度克什知自己的孩子在骚乱中丧生时痛不欲生..</a><a href=”#”>曾参加过唐曾参加过唐到了舟曲参加救援</a></li>
<li><a href=”#”>5、明昆明警方近日捣毁了寻甸县的“洪兴帮”黑恶势力团伙,缴获…</a></li>
<li><a href=”#”>6、曾参加过唐曾参加过唐曾参加过唐曾参加过唐</a></li>
<li><a href=”#”>7、湖北武汉汉口汉口曾参加过唐曾参加过唐曾参加过唐曾参加过唐观看两江洪峰过</a></li>
<li><a href=”#”>8、湖北武汉汉曾参加过唐曾参加过唐曾参加过唐曾参加过唐集在江边观</a></li>
<li><a href=”#”>9、湖北武汉汉口汉口龙王庙景区观景平台上,市民聚集在江边观看两江洪峰过汉</a></li>
</ul>
<ul class=”ul_news_list2″></ul>
</div>
</div>

四、CSS:

body { font-family:”微软雅黑”,Arial,”Lucida Grande”, Verdana, Lucida; font-size:12px; }
*{ padding:0; margin:0;}
img { border:0;}
.clear { clear:both;}
a { color:#000; text-decoration:none;}
a:hover { color:#EC6104;  text-decoration:none;}
.undis { display:none;}/*news_list*/
.news_list_bar { position:relative;  width:560px; height:168px; overflow:hidden; background:url(../images/slideshow2/v3_picture6.gif) repeat-y; background-color:#F00;}
.ul_news_list,
.ul_news_list2{ position:relative; list-style:none;}
.ul_news_list li,
.ul_news_list2 li{line-height:28px;  height:28px; width:500px; overflow:hidden; white-space:nowrap;padding:0 20px;}
.ul_news_list li a,
.ul_news_list2 li a{ padding-right:20px;}
.go_upanddown { position:absolute; margin:-20px 0 0 500px;}
.go_upanddown span { padding-right:10px; cursor:pointer;}

[转载]asp.net mvc fckeditor全攻略

mikel阅读(1203)

[转载]asp.net mvc fckeditor全攻略 – ZilchWei-专注asp.net mvc – 博客园.

环境说明:

软件环境:ASP.NET mvc3   +   vs2010

系统环境:windows xp sp3

浏览器: ie6(不要鄙视我)

首先:最近因为要使用fckeditor,我们在网络上可以找到很多ASP.NET mvc fckeditor使用的教程,结果发现不全面。才有了本文。我就直接进入正题了

第一步我们需要下载2个包:

第一个包:FCKeditor_2.6.6第二包:FCKeditor.Net_2.6.4。我们可以在这里下载http://ckeditor.com/download我下载我是最新版。

解压后我们可以得到如下文件:第一个包:

这里我们只需要5个文件+1个文件夹就搞定。然后我们把它复制到我们项目的Content/Fck文件夹中

第二包:我们只需要FCKeditor.Net_2.6.4\bin\Release\2.0\FredCK.FCKeditorV2.dll这个 Dll文件。同样我们需要复制到项目的bin文件夹中(这里需要右键单击我们的项目 选择在  windows资源管理器中打开)

如下图

这样我们的文件处理就完成了。现在我们需要开始进行对他们的配置。

首先我们右键单击项目用的引用,选择添加引用。然后在选项卡中选择浏览。找到项目\bin\FredCK.FCKeditorV2.dll选中,单击确定。如下

现在我们开始配置第一个包(项目\fck\editor):

1.打开fckconfig.js。找到

var _FileBrowserLanguage = ‘php’ ; // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage = ‘php’ ; // asp | aspx | cfm | lasso | perl | php | py

我们需要修改为

var _FileBrowserLanguage = ‘aspx’ ; // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage = ‘aspx’ ; // asp | aspx | cfm | lasso | perl | php | py

非常不明白为什么默认的是php,难道做php开发的比做.net的要帅?拉回正题。这里我们修改的是上传文件的语言使用aspx

当然我们还需要做一个非常有意义的事情就是将

FCKConfig.DefaultLanguage  = ‘en’ ;改为FCKConfig.DefaultLanguage  = ‘zh-cn’ ;

这里我们将前台显示语言更改为中文。当然如果您愿意每次在前台巧一次代码修改也可以。

我们开始配置Web. Config文件找到节点appSettings我们添加如下代码

<add key=”FCKeditor:BasePath” value=”~/Content/Fck/”/>

<add key=”FCKeditor:UserFilesPath” value=”/FCKPro/Files” />

这里的修改都是方便我们配置,如果您喜欢每次调用配置一次也可以不添加。

现在我们建立HomeController,然后添加一个名为Index的ActionResult代码如下:

public ActionResult Index()
{
return View();
}

然后我们建立一个Aspx的view。

我们在页头引入<%@ Register Assembly=”FredCK.FCKeditorV2″ Namespace=”FredCK.FCKeditorV2″ TagPrefix=”FckV2″%>

然后使用FckV2这个控件具体代码如下

<%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage<dynamic>” %>
<%@ Register Assembly=”FredCK.FCKeditorV2″ Namespace=”FredCK.FCKeditorV2″ TagPrefix=”FckV2″%>
<!DOCTYPE html>

<html>
<head runat=”server”>
<title>Index</title>
</head>
<body>
<div>
<%using (Html.BeginForm()) { %>
<FckV2:FCKeditor runat=”server”  ID=”content”></FckV2:FCKeditor>
<input type=”submit” value=”添加” />
<%} %>
</div></body>
</html>

我们现在可以让我们的程序运行起来

看来不错。。但是我们的新闻是需要图片的。我们尝试下图片上传。悲剧继续发生。我们看了一个错误

我们根据提示路径打开config.ascx文件找到方法private bool CheckAuthentication()修改返回值为true;

OK。可以上传了!

这里我说明下CheckAuthentication。我们最好在里面做一次验证。为什么?

因为当我们方法直接返回为真的时候,服务器不会验证用户是否有权限上传。那么结果会导致所有人可以上传包括hack。

好了。废话了一堆本文到此结束。你可以下载示例项目查看结果。我建议大家按本文做一次。

下载示例

[转载]Android 3.0 r1中文API文档(103) —— InputMethodManager [输入法]

mikel阅读(844)

[转载]Android 3.0 r1中文API文档(103) —— InputMethodManager [输入法] – 农民伯伯 – 博客园.

前言

本章内容是Android.view.inputmethod.InputMethodManager,为输入法相关章节,版本为Android 3.0 r1,翻译来自”六必治”,欢迎大家访问他的博客:http://www.cnblogs.com/zcmky/,再次感谢”六必治” !期待你加入Android API 中文的翻译,联系我over140@gmail.com。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

正文

一、结构

public final class InputMethodManager extends Object

java.lang.Object

android.view.inputmethod.InputMethodManager

二、类概述

整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互。你可以用Context.getSystemService()取得这一接口的实例。

架构总述(Architecture Overview)

输入法框架(IMF)共有三个主要部分:

* 输入法管理器,管理各部分的交互。它是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务。

* 输入法(IME) ,实现一个允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法何时隐藏或者显示它的UI。同一时间只能有一个IME运行。

* 客户应用程序,通过输入法管理器控制输入焦点和IME的状态。一次只能有一个客户端使用IME

应用程序(Applications)

大多数情况下,使用标准TextView或其子类的应用程序只要做少量工作就可以让软键盘(soft input methods)正常工作。你要注意的是:

* 正确设置你的可编辑文本视图inputType,这样输入法有足够的上下文帮助用户向其输入文本。

* 当输入法显示时妥善处理隐藏屏幕空间。理想的情况下应用程序应处理窗口变小,如必要你可以利用系统执行平移窗口。你应在活动(activity)中设置windowSoftInputMode属性或调整创建窗口的相应值,以便系统决定平移或缩放(它会尝试自动调整但可能出错)。

* 你还可以通过相同的windowSoftInputMode控制窗口的首选软键盘状态(打开、关闭等)。

通过API可以与IMF及其IME交互实现更细致的控制,如显示或输入区域,用户选取某输入法等。

当你编写自己的文本编辑器的时候,你要实现onCreateInputConnection(EditorInfo)以返回你的InputConnection的接口实例,用来允许IME和你的文本编辑域来交互。

输入法(Input Methods)

一个输入法(IME)是Service(服务)的实现,通常继承自 InputMethodServiceIME提供核心的 InputMethod接口,尽管提供InputMethod通常是由InputMethodService来处理,而IME的实现只需要处理更高层的API

更多信息参阅InputMethodService

安全(Security)

输入法关系到许多安全问题,因其基本不受约束地驱动UI并监视用户输入。Android输入法框架还允许调度第三方IME,所必须小心以限制他们的选择和相互作用。

以下是IMF背后安全架构的要点:

* 只允许系统访问经BIND_INPUT_METHOD权限许可访问IMEInputMethod接口。通过绑定到要求这个权限的服务来强制实现这一点。所以系统可以保证没有不被信任的客户端在它的控制之外访问到当前的输入法。

* IMF中可能有许多客户进程,但在同一时间只有一个是激活的。未激活客户端不能与IMF核心交互通过下述机制实现。

* 输入法客户端只可访问InputMethodSession接口。每个客户端创建一个接口实例,只有与激活客户相关联的会话的调用才会被IME处理。这点通过普通IME AbstractInputMethodService执行,必须由IME显式的处理,而IME正是InputMethodSession的自定义实现。

* 只有激活的InputConnection接受操作。IMF通知每个客户进程是否激活,IMF忽略非激活进程对当前输入联接的调用。这确保了当前IME只将事件和文本编辑交付用户可见焦点的UI

* 一个IME永远不能在屏幕关闭时与 InputConnection交互。这是通过当屏幕关闭时所有客户端无效,并防止不良IME在用户无法关注其行为时驱动UI

* 客户应用程序可以要求系统选取一个新的IME,但不能编程式选择之一。这是避免恶意程序在用户导航到其它应用程序时,选择自己的IME并保持运行。也就是说,IME可以编程式的要求系统选择其它IME,因它完全控制了用户输入。

用户在可切换至一个新的IME前必须显式的启用它,以确认系统了解它,使其处于可用状态。

三、常量

public static final int HIDE_IMPLICIT_ONLY

hideSoftInputFromWindow(IBinder, int)中的标志,表示如果用户未显式地显示软键盘窗口,则隐藏窗口。

常量值: 1 (0x00000001)

public static final int HIDE_NOT_ALWAYS

hideSoftInputFromWindow(IBinder, int)中的标志,表示软键盘窗口总是隐藏,除非开始时以SHOW_FORCED显示。

常量值: 2 (0x00000002)

public static final int RESULT_HIDDEN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口从显示切换到隐藏时的状态。

常量值: 3 (0x00000003)

public static final int RESULT_SHOWN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口从隐藏切换到显示时的状态。

常量值: 2 (0x00000002)

public static final int RESULT_UNCHANGED_HIDDEN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口不变保持隐藏时的状态。

常量值: 1 (0x00000001)

public static final int RESULT_UNCHANGED_SHOWN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口不变保持显示时的状态。

常量值: 0 (0x00000000)

public static final int SHOW_FORCED

showSoftInput(View, int)标志,表示用户强制打开输入法(如长按菜单键),一直保持打开直至只有显式关闭。

常量值: 2 (0x00000002)

public static final int SHOW_IMPLICIT

showSoftInput(View, int)标志,表示隐式显示输入窗口,非用户直接要求。窗口可能不显示。

常量值: 1 (0x00000001)

四、公共方法

public void displayCompletions (View view, CompletionInfo[] completions)

(译者注:输入法自动完成)

public InputMethodSubtype getCurrentInputMethodSubtype ()

(译者注:获取当前输入法类型?)

public List<InputMethodInfo> getEnabledInputMethodList ()

(译者注:获取已启用输入法列表?)

public List<InputMethodSubtype> getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)

public List<InputMethodInfo> getInputMethodList ()

(译者注:获取输入法列表)

public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes ()

public void hideSoftInputFromInputMethod (IBinder token, int flags)

关闭/隐藏输入法软键盘区域,用户不再看到或与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

flags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS等位设置。

public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)

hideSoftInputFromWindow(IBinder, int, ResultReceiver)的无返回值版:从窗口上下文中确定当前接收输入的窗口,隐藏其输入法窗口

参数

windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)

flags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY位设置。

public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)

从窗口上下文中确定当前接收输入的窗口,要求隐藏其软键盘窗口。它可由用户调用并得到结果而不仅仅是显式要求输入法窗口隐藏。

参数

windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)

flags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY位设置。

resultReceiver  如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, RESULT_HIDDEN

public void hideStatusIcon (IBinder imeToken)

(译者注:隐藏状态栏图标?)

public boolean isAcceptingText ()

当前服务视图接受全文编辑返回真。没有输入法联接为false,这时其只能处理原始按键事件。

public boolean isActive (View view)

视图为当前输入的激活视图时返回真。

public boolean isActive ()

输入法中的任意视图激活时返回真。

public boolean isFullscreenMode ()

判断相关输入法是否以全屏模式运行。全屏时,完全覆盖你的UI时,返回真,否则返回假。

public boolean isWatchingCursor (View view)

如当前输入法要看到输入编辑者的光标位置时返回真。

public void restartInput (View view)

如有输入法联接至视图,重启输入以显示新的内容。可在以下情况时调用此方法:视图的文字导致输入法外观变化或有按键输入流,如应用程序调用TextView.setText()时。

参数

view 文字发生变化的视图。

public void sendAppPrivateCommand (View view, String action, Bundle data)

对当前输入法调用 InputMethodSession.appPrivateCommand()

参数

view 可选的发送命令的视图,如你要发送命令而不考虑视图附加到输入法,此项可以为空。

action 执行的命令名称。必须是作用域的名称,如前缀包名称,这样不同的开发者就不会创建冲突的命令。

data 命令中包含的任何数据。

public boolean setCurrentInputMethodSubtype (InputMethodSubtype subtype)

(译者注:此方法为3.0中新增的方法)

public void setInputMethod (IBinder token, String id)

强制切换到新输入法部件。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

id              切换到新输入法的唯一标识。

public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)

强制切换到一个新的输入法和指定的类型。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。(译者注:此方法为3.0中新增的方法)

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

id 切换到新输入法的唯一标识。

subtype 切换到新输入法的新类型。

public void showInputMethodAndSubtypeEnabler (String topId)

译者注:此方法为3.0中新增的方法)

public void showInputMethodPicker ()

(译者注:显示输入法菜单列表)

public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)

如需要,显式要求当前输入法的软键盘区域向用户显示。当用户与视图交互,用户表示要开始执行输入操作时,可以调用此方法。

参数

view 当前焦点视图,可接受软键盘输入。

flags 提供额外的操作标志。当前可以是0SHOW_IMPLICIT 位设置。

resultReceiver 如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, RESULT_HIDDEN

public boolean showSoftInput (View view, int flags)

showSoftInput(View, int, ResultReceiver)的无返回值版:如需要,显式要求当前输入法的软键盘区域向用户显示。

参数

view 当前焦点视图,可接受软键盘输入。

flags 提供额外的操作标志。当前可以是0SHOW_IMPLICIT 位设置。

public void showSoftInputFromInputMethod (IBinder token, int flags)

显示输入法的软键盘区域,这样用户可以到看到输入法窗口并能与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

flags 提供额外的操作标志。可以是0 SHOW_IMPLICIT, SHOW_FORCED位设置。

public void showStatusIcon (IBinder imeToken, String packageName, int iconId)

(译者注:显示状态栏图标?)

public boolean switchToLastInputMethod (IBinder imeToken)

public void toggleSoftInput (int showFlags, int hideFlags)

(译者注:切换软键盘)

public void toggleSoftInputFromWindow (IBinder windowToken, int showFlags, int hideFlags)

本方法切换输入法的窗口显示。如输入窗口已显示,它隐藏。如无输入窗口则显示。

参数

windowToken  由窗口请求View.getWindowToken()返回得到的令牌(token)

showFlags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY位设置。

hideFlags 提供额外的操作标志。可以是0 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS位设置。

public void updateCursor (View view, int left, int top, int right, int bottom)

返回窗口的当前光标位置。

public void updateExtractedText (View view, int token, ExtractedText text)

(译者注:当内容变化时文本编辑器调用此方法,通知其新提取文本。)

public void updateSelection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)

返回当前选择区域。

五、补充

结束

越忙越需要坚持。

[转载]web页面实现指定区域打印功能

mikel阅读(1038)

[转载]web页面实现指定区域打印功能 – 湛蓝天空ZHW – 博客园.

使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内。

详细如下:

<style media=print type=”text/css”>
.noprint{visibility:hidden}
</style>
要打印的内容。哈哈!
<p class=”noprint”>将不打印的代码放在这里。</p>
<a href=”javascrīpt:window.print()” target=”_self”>打印</a>

第二种方法:指定打印区域

把要打印的内容放入一个 span或div,然后通过一个函数打印。

<span id=’div1′>把要打印的内容放这里</span>
<p>所有内容</p>
<div id=”div2″>div2的内容</div>
<a href=”javascrīpt:printme()” target=”_self”>打印</a>

<scrīpt language=”javascrīpt”>
function printme()
{
document.body.innerHTML=document.getElementById(‘div1’).innerHTML+'<br/>’+document.getElementById(‘div2’).innerHTML;
window.print();
}
</scrīpt>

如果要打印的只是整个页面中的一小部分,就最好采用第二种方法。

第三种方法:如果要打印的页面排版和原web页面相差很大,采用此种方法。

点打印按钮弹出新窗口,把需要打印的内容显示到新窗口中,在新窗口中调用window.print()方法,然后自动关闭新窗口。

[转载]Android跨线程访问模型

mikel阅读(1001)

[转载]安卓跨线程访问模型 – 一尘 – 博客园.

有win32 编程经验的人都懂,windows是基于消息驱动模式的,通过注册窗口回调函数来处理系统push的消息。安卓借鉴windows的消息模型,带有消息循环的线程都有自己的Looper,MessageQueue消息队列和Handler,这里的Handler就是win32中注册的窗口回调函数,不同于 win32的是,这里的Handler对象不但能接受消息,还能向MessageQueue中push消息,下面来看一下他们之间的关系。 .NET CF框架中,UI是非线程安全的,工作线程不能直接修改UI线程中的UI属性;kjava没这麽麻烦,kjava允许工作线程直接修改UI线程中的UI属性,问题是多任务的时候,要考虑UI资源的同步问题;安卓平台中,UI组件也是非线程安全的,不允许工作线程直接修改UI线程的UI组件,那么安卓是怎么处理的呢? 安卓平台中消息线程都维护自己的消息队列,Looper,Handler,在A线程中,可以通过B线程的HandlerB向B线程的消息队列中push消息,B线程的HandlerB从自己的消息队列中获得并处理消息。可以看到跨线程访问的关键在于Handler,通过对方的Handler往对方的消息队列中push消息。 下面是伪代码 1.申明主线程和工作线程的Handler; private Handler mMainHandler, mChildHandler; 2.在主线程中,用工作线程的mChildHandler发送消息; 3.在工作线程中,用工作线程的mChildHandler处理消息; 4.反之也是如此; 细心的朋友可能会发现, mChildHandler对象在主线程和工作线程中都有调用,难道不存在线程同步安全问题? 作者:一尘 出处:http://wmj.cnblogs.com/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

[转载]开源基于C#的腾讯微博SDK V0.1版本发布

mikel阅读(856)

[转载][开源]基于C#的腾讯微博SDK V0.1版本发布 – Kingthy’s blog – 博客园.

开发此SDK项目的起原

对腾讯微博真的不知道怎么说好,它里面的文档非常的乱(莫非真的像网上所说文档说明都是抄新浪的?)

想找个.NET所用的SDK,去官网的论坛下载了C#版本的SDK,却发现里面的代码也是乱且单一,使用起来非常的不方便。而网上其它第三方开发的SDK又非常的难找。所以就打算自己写一个SDK!

项目版本更新历史?

2011-03-02 V0.1

  • 实现了OAuth授权认证
  • 实现了时间线里的所有接口调用
  • 实现了微博相关的部分接口调用,如:获取某条微博数据、发表微博(不带图片)、转播、删除、回复等

2011-03-03 V0.2

  • 重新更改项目框架的划分。
  • 与微博相关的API都已实现完成,现可以发表带图片的微博信息。
  • 实现了帐户相关的所有接口调用。
  • 实现了关系链相关的所有接口调用。

SDK的使用环境?

开发环境:Visual Studio 2010

框架环境:.NET FRAMEWORK V4.0

目前的SDK实现了哪些功能接口?

  • 实现了OAuth授权认证
  • 实现了时间线里的所有接口调用
  • 实现了微博相关的部分接口调用,如:获取某条微博数据、发表微博(不带图片)、转播、删除、回复等

目前返回的数据只是以XML文本数据返回,暂未实现对象实体化处理(后续版本会实现)。

怎么使用此SDK?

1、下载项目源码编译项目取得DLL库文件或已编译的DLL库文件,将DLL库文件引用到你的项目中。

2、取得你的腾讯微博应用的APP_Key与APP_Secret,如果没有请自行前去腾讯微博开者平台申请。

3、根据APP_Key与APP_Secret实例化OAuth对象,并进入OAuth授权进程,最终取得Access Token值。

4、根据Access Token调用各种接口即可。

示例代码:(此示例代码摘自此SDK项目中的测试项目)

OAuth oauth = new OAuth(appKey, appSecret);

//获取请求Token
if (oauth.GetRequestToken(null))
{
Console.WriteLine(
获取Request Token成功。值如下:);
Console.WriteLine(
TokenKey={0}, oauth.Token);
Console.WriteLine(
TokenSecret={0}, oauth.TokenSecret);
Console.WriteLine(
正在请求授权, 请在授权后,将页面提示的授权码码输入下面并继续……);
Process.Start(
https://open.t.qq.com/cgi-bin/authorize?oauth_token= + oauth.Token);
Console.Write(
授权码:);
string verifier = Console.ReadLine();
string name;
if (oauth.GetAccessToken(verifier, out name))
{
Console.WriteLine(
获取Access Token成功。值如下:);
Console.WriteLine(
TokenKey={0}, oauth.Token);
Console.WriteLine(
TokenSecret={0}, oauth.TokenSecret);
Console.WriteLine(
微博帐户名={0}, name);
}
else
{
Console.WriteLine(
获取Access Token时出错,错误信息: {0}, oauth.LastError);
}
}
else
{
Console.WriteLine(
获取Request Token时出错,错误信息: {0}, oauth.LastError);
}

if (oauth.LastError != null)
{
Console.Read();
return;
}
string data;
Timeline timeline
= new Timeline(oauth);
//获取”冷笑话”话题相关的言论
//string data = timeline.GetHTTimeline(OpenTSDK.Tencent.Objects.PageFlag.First, “冷笑话”, null, 10);
//Console.WriteLine(data);
Twitter twitter = new Twitter(oauth);
data
= twitter.Delete(27523037404757);
Console.WriteLine(data);

TweetContent tc = new TweetContent(#TXOpenTSDK# 测试发带图片的微博功能….., 127.0.0.1);
tc.Picture
= new UploadFile(@”t.jpg); //设置图片文件地址
data = twitter.Add(tc);
Console.WriteLine(data);
Console.Read();

此SDK采用的开源协议?

采用LGPL协议,所以你可以任意使用此SDK包库文件,包括你的商业程序。但请您遵守LGPL开源协议的规定使用!

SDK的项目托管地址?

此SDK项目托管于Google Code。

URL: http://code.google.com/p/txopent/
SVN: http://txopent.googlecode.com/svn/trunk/OpenTSDK

注:众人拾柴火焰高,欢迎各位加入到此SDK项目的开发中来。

微博:@kingthy

话题:#TXOpenTSDK#

[转载]Android学习之 Activity 生命周期(LifeCycle)

mikel阅读(856)

[转载]Android学习之 Activity 生命周期(LifeCycle) – 潺缘 – 博客园.

今天学习Activity LifeCycle.

Android,系统把Activities当做一个Activity Stack进行管理。当一个新的Activity被启动时,它将放在这个Activity Stack的最顶部,然后成为一个Running Activity. 而上一个Activity总是在这个Activity的下一层,且将不会再显示到前端直到一个新的Activity存在!

一个Activity本质上来说包括以下四个状态:

1. 当一个Activity在屏幕的前台(foreground)时(同时也在Activity Stack的顶部)时,这个Activity就处在active或running状态。

2. 当一个Activity失去了焦点,但是可见(例如:一个新的不是全屏的activity处于Activity Stack顶部)时,Activity处理Paused状态. 一个被Paused的Activity是完全可用的(alive)(这时的Activity将保存所有的状态与成员信息且仍处理Window manager 的attach范围), 这种状态下的Activity在系统极度缺少内存的情况下被系统杀掉!

3. 如果一个Activity完全被另一个Activity覆盖时,该Activity就处理Stoped状态。它将仍然保存所有状态与成员信息,但是,它对 用户已经不在可见,所以,它的窗口被隐藏了。当系统需要内存时,系统会经常杀掉这种状态的Activity。

4.当一个activity处理paused或stopped状态时,系统可以清除这个activity的内存而不调用这个activity的finish方法或者简单的结束它的进程,当它被再次显示给用户,它需要再次完全启动,并还原到最近的一状态。

下面所说的方法可以理解为Activity进入对应状态时会被调用的方法!

下面的一张图说明了Activity的状态变化路线图。长方形表示你可以覆盖这些方法,以便在Activity状态切换之间执行一定的动作。含有颜色的椭圆表示Activity可能经常处于的状态!

activity_lifecycle

下面是三个在你控制或监控(monitoring)Activity过程中比较重要的三个循环:

1. 全个生命期(The entire lifetime). 这个生命周期发生在第一调用onCreate(Bundle)方法到最终的对onDestroy()的调用。一个Acitivity可以在 onCreate()方法中对全局的状态进行初始化,在onDestroy中释放所有用到的资源。例如:如果需要一个后台运行的从网络中下载数据的线程, 那么可以在onCreate()函数中进行创建,在onDestroy()中停止。

2. 可视生命期(visible lifetime). 这个生命期从调用onStart()方法开始到调用onStop()函数结束。在该生命期中,用户可以在屏幕上看到这个activity,尽管他可能不在 前台,不能与用户进行交互,在这个生命期中,你可以维护那些你要显示给用户看的数据。例如:为了监控所有可以对你的UI产生影响的消息,你可以在 onStart()函数中注册一个BroadcastReceiver,然后当用户不能看到你所要显示的信息,在onStop()函数中反注册它。 onStart()与onStop()方法可以被调用多次。

3. 前台生命期(foreground lifetime).前台生命期从onResume()到onPause()。在这期间,这个activity在其他activity的前面,且正在与用 户进行交互。一个activity可以很频繁的在Resumed与Paused状态之间进行切换。例如当设备Sleep时、一个Activity result被传递时、一个新的Intent被传递时等。所以,运行在这期间的代码必须时快速轻量级的。

一个 activity的整个生命周期定义在下面的activity方法中。你可以覆盖这些方法,使得activity在不同状态之间执行一定的动作。所有的 activities都将实现onCreate(Bundle)方法去完成初始化设置工作,在实现这些方法的过程中,你需要经常调用这些方法的 superclass.

01 public class Activity extends ApplicationContext {
02 protected void onCreate(Bundle savedInstanceState);
03
04 protected void onStart();
05
06 protected void onRestart();
07
08 protected void onResume();
09
10 protected void onPause();
11
12 protected void onStop();
13
14 protected void onDestroy();
15 }

Most importantly, any changes made by the user should at this point be committed (usually to the ContentProvider holding the data).

重要一点:用户操作的变化都应该在这时进行保存!通常使用ContentProvider进行保存!

以上资料是我翻译自Android 3.0 Doc. 恳请高手指点!

[转载]Android应用程序的常见数据存储方式小结

mikel阅读(775)

[转载]Android应用程序的常见数据存储方式小结 – 宁 静 致 远 – 博客园.

任何软件程序实质都是为了处理数据而存在的,在Android系统中针对数据的重要程序、数据的特点、读写频率等不同情况,经常采用四种方式:

  • Preference
  • 文件
  • SQLite数据库
  • 网络

经过对上面四种方式的分析总结,列出下面这张图来说明各自的特点,在实际运行用根据需求来选择合适的数据存放方式。

Android中的数据存取

由于时间仓促,错误在所难免,敬请各位不吝赐教,希望能起到抛砖引玉的作用,大家共同进步,谢谢

[转载]Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)

mikel阅读(808)

[转载]Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等) – 成为自己比什么都重要! – 博客园.

1判断select选项中 是否存在Value=”paraValue”的Item
2向select选项中 加入一个Item
3从select选项中 删除一个Item
4删除select中选中的项
5修改select选项中 value=”paraValue”的text为”paraText”
6设置select中text=”paraText”的第一个Item为选中
7设置select中value=”paraValue”的Item为选中
8得到select的当前选中项的value
9得到select的当前选中项的text
10得到select的当前选中项的Index
11清空select的项

js 代码
// 1.判断select选项中 是否存在Value=”paraValue”的Item
function jsSelectIsExitItem(objSelect, objItemValue) {
var isExit = false;
for (var i = 0; i < objSelect.options.length; i++) {
if (objSelect.options[i].value == objItemValue) {
isExit
= true;
break;
}

}

return isExit;
}


// 2.向select选项中 加入一个Item
function jsAddItemToSelect(objSelect, objItemText, objItemValue) {
//判断是否存在
if (jsSelectIsExitItem(objSelect, objItemValue)) {
alert(
该Item的Value值已经存在);
}
else {
var varItem = new Option(objItemText, objItemValue);
objSelect.options.add(varItem);
alert(
成功加入);
}

}


// 3.从select选项中 删除一个Item
function jsRemoveItemFromSelect(objSelect, objItemValue) {
//判断是否存在
if (jsSelectIsExitItem(objSelect, objItemValue)) {
for (var i = 0; i < objSelect.options.length; i++) {
if (objSelect.options[i].value == objItemValue) {
objSelect.options.remove(i);
break;
}

}

alert(
成功删除);
}
else {
alert(
该select中 不存在该项);
}

}



// 4.删除select中选中的项
function jsRemoveSelectedItemFromSelect(objSelect) {
var length = objSelect.options.length 1;
for(var i = length; i >= 0; i){
if(objSelect[i].selected == true){
objSelect.options[i]
= null;
}

}

}


// 5.修改select选项中 value=”paraValue”的text为”paraText”
function jsUpdateItemToSelect(objSelect, objItemText, objItemValue) {
//判断是否存在
if (jsSelectIsExitItem(objSelect, objItemValue)) {
for (var i = 0; i < objSelect.options.length; i++) {
if (objSelect.options[i].value == objItemValue) {
objSelect.options[i].text
= objItemText;
break;
}

}

alert(
成功修改);
}
else {
alert(
该select中 不存在该项);
}

}


// 6.设置select中text=”paraText”的第一个Item为选中
function jsSelectItemByValue(objSelect, objItemText) {
//判断是否存在
var isExit = false;
for (var i = 0; i < objSelect.options.length; i++) {
if (objSelect.options[i].text == objItemText) {
objSelect.options[i].selected
= true;
isExit
= true;
break;
}

}

//Show出结果
if (isExit) {
alert(
成功选中);
}
else {
alert(
该select中 不存在该项);
}

}


// 7.设置select中value=”paraValue”的Item为选中
document.all.objSelect.value = objItemValue;

// 8.得到select的当前选中项的value
var currSelectValue = document.all.objSelect.value;

// 9.得到select的当前选中项的text
var currSelectText = document.all.objSelect.options[document.all.objSelect.selectedIndex].text;

// 10.得到select的当前选中项的Index
var currSelectIndex = document.all.objSelect.selectedIndex;

// 11.清空select的项
document.all.objSelect.options.length = 0;

[转载]Android开发者指南(1) —— Android Debug Bridge(adb)

mikel阅读(867)

[转载]Android开发者指南(1) —— Android Debug Bridge(adb) – 农民伯伯 – 博客园.

前言

本章内容为开发者指南(Dev Guide)/Developing/Tools/adb,这是一篇非常优秀的译稿,翻译来自”移动云_文斌”,欢迎访问它的博客:”http://blog.csdn.net/caowenbin“,再次感谢”移动云_文斌” !期待你一起参与翻译Android的相关资料,联系我over140@gmail.com。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

正文

Android Debug Bridge

Android调试桥接器,简称adb,是用于管理模拟器或真机状态的万能工具,采用了客户端服务器模型,包括三个部分:

* 客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像ADB插件和DDMS这样的Android工具也可以调用adb客户端。

* 服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。

* 守护进程部分,运行于模拟器或手机的后台。

当启动adb客户端时,客户端首先检测adb服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的TCP5037端口,并且监听从adb客户端发来的命令——所有的adb客户端都使用5037端口与adb服务端通信。

接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描5555-5585之间的奇数号端口来搜索模拟器或手机,一旦发现adb守护进程,就通过此端口进行连接。需要说明的是,每一个模拟器或手机使用一对有序的端口,偶数号端口用于控制台连接,奇数号端口用于adb连接,例如:

Emulator 1, console: 5554
Emulator
1, adb: 5555
Emulator
2, console: 5556
Emulator
2, adb: 5557

即如果模拟器与adb5555端口连接,则其与控制台的连接就是5554端口。

当服务端与所有的模拟器建立连接之后,就可以使用adb命令来控制或者访问了。因为服务端管理着连接并且可以接收到从多个adb客户端的命令,所以可以从任何一个客户端或脚本来控制任何模拟器或手机设备。

下文介绍了可以用来管理模拟器或手机的这些adb命令。如果是在Eclipse并且安装了ADT插件的环境下开发Android应用程序,就不需要从命令行使用adb了,ADT插件已经提供了透明的集成。不过,还是可以在调试等需要的时候直接使用adb

使用adb命令

从开发用电脑的命令行或脚本文件中使用adb命令的用法是:

      adb [-d|-e|-s <serialNumber>] <command>

当使用的时候,程序会调用adb客户端。因为adb客户端不需要关联到任何模拟器,所以如果有多个模拟器或手机正在运行,就需要使用-d参数指定要操作的是哪一个,更多关于这些选项参数的使用可以参见Directing Commands to a Specific Emulator/Device Instance

查询模拟器或手机状态

了解adb服务端连接的模拟器或手机可以帮助更好的使用adb命令,这可以通过devices命令列举出来:

 adb devices

执行结果是adb为每一个设备输出以下状态信息:

* 序列号(serialNumber) adb创建的使用控制台端口号的用于唯一标识一个模拟器或手机设备的字符串,格式是 <设备类型>-<端口号>,例如: emulator-5554

* 状态(state) 连接状态,其值是:

offline未连接或未响应

device已经连接到服务商。注意这个状态并不表示Android系统已经完全启动起来,系统启动的过程中已经可以连接adb,但这个状态是正常的可操作状态。

每一个设备的输出形如:

 [serialNumber] [state]

下面是 devices 命令和其执行结果:

$ adb devices
List of devices attached 
emulator-5554  device
emulator-5556  device
emulator-5558  device

如果没有模拟器或手机在运行,该状态返回的是no device

操作指定的模拟器或手机

如果有多个模拟器或手机正在运行,当使用adb命令的时候就需要指定目标设备,这可以通过使用-s选项参数实现,用法是:

adb -s <serialNumber> <command>

即可以在adb命令中使用序列号指定特定的目标,前文已经提到的devices命令可以实现查询设备的序列号信息。

例如:

adb -s emulator-5556 install helloWorld.apk

需要注意的是,如果使用了-s而没有指定设备的话,adb会报错。

安装应用程序

可以使用adb从开发用电脑中复制应用程序并且安装到模拟器或手机上,使用install命令即可,在这个命令中,必须指定待安装的.apk文件的路径:

adb install <path_to_apk>

关于创建可安装的应用的更多信息,请参见Android Asset Packaging Tool (aapt).

注意,如果使用了安装有ADT插件的Eclipse开发环境,就不需要直接使用adbaapt命令来安装应用程序了,ADT插件可以自动完成这些操作。

转发端口

可以使用forward 命令转发端口 将特定端口上的请求转发到模拟器或手机的不同的端口上。下例是从6100端口转到7100端口:

      adb forward tcp:6100 tcp:7100

也可以使用UNIX命名的socket标识:

      adb forward tcp:6100 local:logd 

与模拟器或手机传输文件

可以使用adb pull push 命令从模拟器或手机中复制文件,或者将文件复制到模拟器或手机中。与 install 命令不同,它仅能复制.apk文件到特定的位置, pull push 命令可以复制任意文件夹和文件到模拟器或手机的任何位置。

从模拟器或手机中复制一个文件或文件夹(递归的)使用:

adb pull <remote> <local>

复制一个文件或文件夹(递归的)到模拟器或手机中使用:

adb push <local> <remote>

在这个命令中<local><remote>引用的是文件或文件夹的路径,在开发用电脑上的是local,在模拟器或手机上的是remote

例如:

adb push foo.txt /sdcard/foo.txt

adb命令列表

下表列出了所有adb支持的命令及其说明:

类别 命令 说明 备注
可选项 -d 命令仅对USB设备有效 如果有多个USB设备就会返回错误
-e 命令仅对运行中的模拟器有效 如果有多个运行中的模拟器就会返回错误
-s <serialNumber> 命令仅对adb关联的特定序列号的模拟器或手机有效(例如 “emulator-5556”). 如果不指定设备就会返回错误
一般项 devices 输出所有关联的模拟器或手机设备列表 参见 Querying for Emulator/Device Instances 以获得更多信息。
help 输出adb支持的命令
version 输出adb的版本号
调试项 logcat [<option>] [<filter-specs>] 在屏幕上输出日志信息
bugreport 为报告bug,在屏幕上输出dumpsys dumpstate logcat数据
jdwp 输出有效的JDWP进程信息 可以使用 forward jdwp:<pid> 转换端口以连接到指定的 JDWP 进程,例如:

adb forward tcp:8000 jdwp:472

jdb -attach localhost:8000

数据项 install <path-to-apk> 安装应用程序(用完整路径指定.apk文件)
pull <remote> <local> 从开发机COPY指定的文件到模拟器或手机
push <local> <remote> 从模拟器或手机COPY文件到开发机
端口和网络项 forward <local> <remote> 从本地端口转换连接到模拟器或手机的指定端口 端口可以使用以下格式表示:

l tcp:<portnum>

l local:<UNIX domain socket name>

l dev:<character device name>

l jdwp:<pid>

ppp <tty> [parm]… 通过USB运行UPP

l <tty> —PPP流中的tty。例如:/dev/omap_csmi_ttyl

l [parm]… — 0到多个PPP/PPPD 选项, 例如 defaultroute, local, notty等等。

注意不用自动启动PPP连接

脚本项 get-serialno 输出adb对象的序列号 参见 Querying for Emulator/Device Instances以获得更多信息。
get-state 输出adb设备的状态
wait-for-device 阻塞执行直到设备已经连接,即设备状态是 device. 可以在其他命令前加上此项,那样的话adb就会等到模拟器或手机设备已经连接才会执行命令,例如:

注意该命令并不等待系统完全启动,因此不能追加需要在系统完全启动才能执行的命令,例如install 命令需要Android包管理器支持,但它必须在系统完全启动后才有效。下面的命令

会在模拟器或手机与adb发生连接后就执行install,但系统还没有完全启动,所以会引起错误。

服务端项 start-server 检测adb服务进程是否启动,如果没启动则启动它。
kill-server 终止服务端进程
Shell shell 在目标模拟器或手机上启动远程SHELL 参见 Issuing Shell Commands以获得更多信息。
shell [<shellCommand>] 在目标模拟器或手机上执行shellCommand然后退出远程SHELL

执行Shell命令

Adb提供了shell来在模拟器或手机上运行各种各样的命令,这些命令的二进制形式存在于这个路径中:

/system/bin/...

无论是否进入adb远程shell,都可以使用 shell 命令来执。

在未进入远程shell的情况下可以按下述格式执行单条命令:

adb [-d|-e|-s {<serialNumber>}] shell <shellCommand>

启动远程shell使用下面的格式:

adb [-d|-e|-s {<serialNumber>}] shell

退出远程shell时使用CTRL+D exit 终止会话。

以下是可以使用的shell命令的更多信息。

从远程shell检查SQLite3 数据库

通过远程shell,可以使用sqlite3命令行程序来管理由应用程序创建的SQLite数据库。 sqlite3 工具包含很多有用的命令,例如 .dump 用于输出表格的内容,.schema 用于为已经存在的表输出 SQL CREATE 语句。 并且该工具也提供了联机执行SQLite命令的能力。

使用 sqlite3时,向前文描述的那样进入模拟器的远程shell,然后使用sqlite3 命令。也可以在调用 sqlite3时指定数据库的全路径。SQLite3数据库存储在/data/data/<package_name>/databases/路径下。

示例:

$ adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit

一旦运行了 sqlite3,就可以使用 sqlite3 命令,退出并返回远程shell可以使用 exit CTRL+D

使用Monkey进行UI或应用程序测试

Monkey是运行于模拟器或手机上的一个程序,通过生成伪随机的大量的系统级的用户事件流来模拟操作,包括单击、触摸、手势等。从而为正在开发中的应用程序通过随机响应进行压力测试。

最简单使用monkey的方式是通过下面的命令行,它可以运行指定的应用程序并向其发送500个伪随机事件。

$ adb shell monkey -v -p your.package.name 500

关于monkey更多的选项及详细信息,请参见UI/Application Exerciser Monkey

其他Shell命令

下表列出了很多有效的adb shell命令,完整的列表可以通过启动模拟器并且使用adb help命令获取。

adb shell ls /system/bin

帮助对于大部分命令是有效的。

Shell 命令 描述 备注
dumpsys 在屏幕上显示系统数据 The Dalvik Debug Monitor Service (DDMS) 工具提供了更易于使用的智能的调试环境。
dumpstate 将状态输出到文件
logcat [<option>]… [<filter-spec>]… 输出日志信息
dmesg 在屏幕上输出核心调试信息
start 启动或重新启动模拟器或手机
stop 停止模拟器或手机

使用logcat查看日志

Android日志系统提供了从众多应用程序和系统程序中收集和查看调试信息的机制,这些信息被收集到一系统循环缓冲区中,可以 logcat 命令查看和过滤。

使用 logcat 命令

查看和跟踪系统日志缓冲区的命令logcat的一般用法是:

[adb] logcat [<option>] ... [<filter-spec>] ...

下文介绍过滤器和命令选项,详细内容可参见Listing of logcat Command Options

可以在开发机中通过远程shell的方式使用logcat命令查看日志输出:

$ adb logcat

如果是在远程shell中可直接使用命令:

# logcat

过滤日志输出

每一条日志消息都有一个标记和优先级与其关联。

标记是一个简短的字符串,用于标识原始消息的来源 (例如“View” 来源于显示系统)

优先级是下面的字符,顺序是从低到高

V明细 (最低优先级)

D调试

I信息

W警告

E错误

F严重错误

S无记载 (最高优先级,没有什么会被记载)

通过运行logcat ,可以获得一个系统中使用的标记和优先级的列表,观察列表的前两列,给出的格式是<priority>/<tag>

这里是一个日志输出的消息,优先级是“I”,标记是“ActivityManager”:

I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}

如果想要减少输出的内容,可以加上过滤器表达式进行限制,过滤器可以限制系统只输出感兴趣的标记优先级组合。

过滤器表达式的格式是tag:priority … ,其中tag是标记, priority是最小的优先级, 该标记标识的所有大于等于指定优先级的消息被写入日志。也可以在一个过滤器表达式中提供多个这样的过滤,它们之间用空格隔开。

下面给出的例子是仅输出标记为“ActivityManager”并且优先级大于等于“Info”和标记为“MyApp”并且优先级大于等于“Debug”的日志:

adb logcat ActivityManager:I MyApp:D *:S

上述表达式最后的 *:S 用于设置所有标记的日志优先级为S,这样可以确保仅有标记为“View”(译者注:应该为ActivityManager,原文可能是笔误)和“MyApp”的日志被输出,使用 *:S 是可以确保输出符合指定的过滤器设置的一种推荐的方式,这样过滤器就成为了日志输出的“白名单”。

下面的表达是显示所有优先级大于等于“warning”的日志:

adb logcat *:W

如果在开发用电脑上运行 logcat (相对于运行运程shell而言),也可以通过ANDROID_LOG_TAGS环境变量设置默认的过滤器表达式:

export ANDROID_LOG_TAGS=“ActivityManager:I MyApp:D *:S”

需要注意的是,如果是在远程shell或是使用adb shell logcat 命令运行logcat ANDROID_LOG_TAGS 不会导出到模拟器或手机设备上。

控制日志格式

日志消息在标记和优先级之外还有很多元数据字段,这些字段可以通过修改输出格式来控制输出结果, -v 选项加上下面列出的内容可以控制输出字段:

brief显示优先级/标记和原始进程的PID (默认格式)

process仅显示进程PID

tag仅显示优先级/标记

thread仅显示进程:线程和优先级/标记

raw显示原始的日志信息,没有其他的元数据字段

time显示日期,调用时间,优先级/标记,PID

long显示所有的元数据字段并且用空行分隔消息内容

可以使用 -v启动 logcat来控制日志格式:

[adb] logcat [-v <format>]

例如使用 thread 输出格式:

adb logcat -v thread

注意只能在 -v 选项中指定一种格式。

Viewing Alternative Log Buffers

Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b 选项,以下是可以指定的缓冲区:

radio查看包含在无线/电话相关的缓冲区消息

events查看事件相关的消息

main查看主缓冲区 (默认缓冲区)

-b 选项的用法:

[adb] logcat [-b <buffer>]

例如查看radio缓冲区:

adb logcat -b radio

查看stdoutstderr

默认的,Android系统发送 stdout stderr (System.out System.err) 输出到 /dev/null Dalvik VM进程,可以将输出复制到日志文件,在这种情况下,系统使用 stdout stderr标记写入日志,优先级是I

要想使用这种方式获得输出,需要停止运行中的模拟器或手机,然后使用命令 setprop 来允许输出重定位,示例如下:

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

系统会保留这一设置直到模拟器或手机退出,也可以在设备中增加/data/local.prop以使得这一设备成为默认配置。

Logcat命令选项列表

选项 描述
-b <buffer> 加载不同的缓冲区日志,例如 event radiomain 缓冲区是默认项,参见Viewing Alternative Log Buffers.
-c 清空(刷新)所有的日志并且退出
-d 在屏幕上输出日志并退出
-f <filename> 将日志输出到文件<filename>,默认输出是stdout.
-g 输出日志的大小
-n <count> 设置最大的循环数据<count>,默认是4,需要-r选项
-r <kbytes> <kbytes>循环日志文件,默认是16,需要 -f 选项
-s 设置默认的过滤器为无输出
-v <format> 设置输出格式,默认的是brief,支持的格式列表参见Controlling Log Output Format.

停止adb服务

在某些情况下,可能需要终止然后重启服务端进程,例如adb不响应命令的时候,可以通过重启解决问题。

使用kill-server可以终止服务端,然后使用其他的adb命令重启。

原文

http://developer.android.com/guide/developing/tools/adb.html

下载

结束

翻译组已同时组织翻译API和开发者指南,并计划出开发者指南的合集,现正边搜集边翻译,预计4/5月份出首个合集,欢迎大家一起参与,并与我们分享你的进度,点这里下载,发邮件告诉我们你翻译的章节。