android 技巧

【安卓逆向】IDA调试 android so文件的10个技巧 在android调试过程中,经常会遇到一些小问题以及解决的方法分享给大家,抛砖引玉。。。 1、使用模拟器调试可能经常遇到异常,然后就进行不下去了,最好换成手机。 2、即使用手机时,也可能会遇到异常造成单步或RUN卡死在一条指令上的问题。这样可以手动的执行这条指令,然后将PC指针设置成为下一条指令位置,开始执行。 3、IDA多线程调试方法 在IDA中如果已经启动了多个线程,并且设置在多个线程设置... 阅读详情



技巧篇

这里记录一些为分类的技巧

遇到ANR的解决方案

    adb pull /data/anr/traces.txt .

通过上面的命令,得到anr详细信息。可以从中找到线索解决这个问题。

adb 获取设备信息

adb shell getprop

adb shell dumpsys window | grep DisplayWidth

如何控制Activity的显示大小及位置?

通常情况下activity会覆盖整个屏幕,有时候我们需要控制activity的大小及显示位置,比如我们把一个activity设置为 “Theme.Dialog” 主题,同时希望其显示位置及大小也随我们控制。 可以通过下面在activity的 onCreate方法中加入以下代码满足我们的要求。 注:下面的代码必须放置在setContentView()方法之后。

    WindowManager m = getWindowManager();
        Display d = m.getDefaultDisplay();  //为获取屏幕宽、高
 
        LayoutParams p = getWindow().getAttributes();  //获取对话框当前的参数值
        p.height = (int) (d.getHeight() * 0.6);   //高度设置为屏幕的0.6
        p.width = (int) (d.getWidth() * 0.95);    //宽度设置为屏幕的0.95
        //p.x = 20;  设置顶点坐标
                //p.y= 30;
        getWindow().setAttributes(p);     //设置生效

如何弹出选择默认应用的对话框?

ResolverActivity, 默认浏览器

弹出所有支持的浏览器

                Intent intent = new Intent();
                intent.setAction("android.intent.action.VIEW");
                intent.addCategory(Intent.CATEGORY_BROWSABLE);
                Uri content_url = Uri.parse("http://3g.sina.cn");
                intent.setData(content_url);
                ComponentName com = new ComponentName("android",
                        "com.android.internal.app.ResolverActivity");
                intent.setComponent(com);

按包名过滤logcat调试信息

#!/bin/bash
packageName=$1
pid=`adb shell ps | grep $packageName | awk '{print $2}'`
adb logcat | grep --color=auto $pid

使用系统提供的组件进行截图

关键字:com.android.camera.action.CROP

android 的很多组件提供非常松散的调用,下面通过Intent实现截取图片的功能。

final Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera", "com.android.camera.CropImage");
intent.setData(Uri.fromFile(mFile));
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
intent.putExtra("aspectX", width);
intent.putExtra("aspectY", height);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true);
intent.putExtra("output", Uri.parse("file:/" + mFile.getAbsolutePath()));
startActivityForResult(intent, REQUEST_CROP_IMAGE);

如何使输入键盘不遮挡输入内容?

可以通过“ android:windowSoftInputMode“ 属性来控制输入键盘和输入窗口

android:windowSoftInputMode=“adjustPan” 显示输入键盘不调整主视图的大小

android:windowSoftInputMode=“adjustResize” 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间(主视图会被挤上去)

示例:

<activity android:name=".MxBrowserActivity"
            android:launchMode="singleTask" android:alwaysRetainTaskState="true"
            android:windowSoftInputMode="adjustPan" android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden">

如何获取系统已经安装组件的列表?

 PackageManager packageManager = this.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);

如何获取支持分享的组件列表?

     List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
     Intent intent=new Intent(Intent.ACTION_SEND,null);
     intent.addCategory(Intent.CATEGORY_DEFAULT);
     intent.setType("text/plain");
     PackageManager pManager = context.getPackageManager();
     mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
 
     return mApps;

如何判断程序启动是从最近任务列表(长按home键)开始?

有时我们需要知道程序被启动是从luncher还是从最近任务列表启动可以使用以下方法

intent来自桌面或最近任务列表

        final int flags = intent.getFlags();
        String action = intent.getAction();
       if (Intent.ACTION_MAIN.equals(action) ||(flags &   Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)  = 0) {
 
        }

Android UI 优化 使用<include/>和 <merge />标签

使用<include /> 标签来重用layout代码 如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码,该标签在android开发文档中没有相关的介绍。在android主屏程序中 用到了这个标签:

<com.android.launcher.Workspace
  android:id="@+id/workspace"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  launcher:defaultScreen="1">
  <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
  <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
  <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
 
</com.android.launcher.Workspace>

这样可以多次引用一个布局片段而不用重复的复制、粘贴。通过include标签也可以覆写一些属性的值,例如上面的示例就覆写了引用的layout中的id值。下面是另外一个示例:

<include android:layout_width="fill_parent" layout="@layout/image_holder" />
<include android:layout_width="256dip" layout="@layout/image_holder" />

使用<merge /> 标签来减少视图层级结构,在Android layout文件中需要一个顶级容器来容纳其他的组件,而不能直接放置多个组件,例如如下的代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Golden Gate" />
</FrameLayout>

单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构。 将通过一个例子来了解这个标签实际所产生的作用,这样可以更直观的了解<merge/>的用法。 建立一个简单的Layout,其中包含两个Views元素:ImageView和TextView 默认状态下我们将这两个元素放在FrameLayout中。其效果是在主视图中全屏显示一张图片,之后将标题显示在图片上,并位于视图的下方。以下是xml代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
 
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
 
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dip"
        android:layout_gravity="center_horizontal|bottom"
 
        android:padding="12dip"
 
        android:background="#AA000000"
        android:textColor="#ffffffff"
 
        android:text="Golden Gate" />
 
</FrameLayout>

应用上边的Layout运行的视图为:

启动 tools> hierarchyviewer.bat工具查看当前UI结构视图:

我们可以很明显的看到由红色线框所包含的结构出现了两个framelayout节点,很明显这两个完全意义相同的节点造成了资源浪费(这里可以提醒大家在开发工程中可以习惯性的通过hierarchyViewer查看当前UI资源的分配情况),那么如何才能解决这种问题呢(就当前例子是如何去掉多余的frameLayout节点)?这时候就要用到<merge />标签来处理类似的问题了。我们将上边xml代码中的framLayout替换成merge:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
 
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
 
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dip"
        android:layout_gravity="center_horizontal|bottom"
 
        android:padding="12dip"
 
        android:background="#AA000000"
        android:textColor="#ffffffff"
 
        android:text="Golden Gate" />
 
</merge>

运行程序后在Emulator中显示的效果是一样的,可是通过hierarchyviewer查看的UI结构是有变化的,当初多余的FrameLayout节点被合并在一起了,或者可以理解为将merge标签中的子集直接加到Activity的FrameLayout跟节点下(这里需要提醒大家注意:所有的Activity视图的根节点都是frameLayout)。如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能应用上边的例子通过merge来优化UI结构。

除了上边的例子外,meger还有另外一个用法,当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。

另外有两点需要特别注意:

<merge />只可以作为xml layout的根节点。 当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。(更多说明请参见inflate()文档)

如何调用系统浏览器打开一个网址?

am start -a android.intent.action.VIEW -d http://www.xiashou.net

如何通过命令行启动一个程序

adb shell am start -n com.google.android.contacts/.ContactsActivity

如何指定设备和模拟器

指定安装在真实设备

adb -d install abc.apk

指定安装在模拟器

adb -e install abc.apk

查看bug

adb bugreport

查看内核日志信息

adb shell dmesg

如何通过xml布局文件构建一个自定义的类?

对于public 属性的 类存在两种形式:

1

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    >
        <view class="com.test.MyView"
            android:id="@+id/myview"
            android:layout_height="5dip"
            android:layout_width="fill_parent"
 
            />
</LinearLayout>

2

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    >
        <com.test.MyView
            android:id="@+id/myview"
            android:layout_height="5dip"
            android:layout_width="fill_parent"
 
            />
</LinearLayout>

对于内部类我们可以采用下面的形式从布局文件构造

<!-- 其中SubView是MyView的子类-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    >
        <view class="com.test.MyView$SubView"
            android:id="@+id/SubView"
            android:layout_height="5dip"
            android:layout_width="fill_parent"
            />
</LinearLayout>

自定义视图代码结构如下

class MyClass extend View
{
   private static class SubView extends View {
   }
}

通过xml构造绘制一个动态图像

我们可以直接通过xml构造一个动态的Drawable对象,xml描述如下

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_black_16"
    android:pivotX="50%"
    android:pivotY="50%"
    android:framesCount="12"
    android:frameDuration="100" />

使用代码如下

mCircularProgress = (Drawable) resources.getDrawable(
                com.android.internal.R.drawable.search_spinner);
//set drawable to view
 
((Animatable) mCircularProgress).start();
((Animatable) mCircularProgress).stop();

相关TAG:AnimationDrawable

 AnimationDrawable

此方式在android 2.1下支持

如何隐藏输入法对话框?

    InputMethodManager imm = (InputMethodManager)
        getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
       imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);

如何阻止编辑框弹出输入法对话框?

editText.setOnTouchListener(new OnTouchListener() {
 
 public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    //记住EditText的InputType现在是password
    int inType = editText.getInputType(); // backup the input type
    editText.setInputType(InputType.TYPE_NULL); // disable soft input
    editText.onTouchEvent(event); // call native handler
    editText.setInputType(inType); // restore input type
    editText.setSelection(editText.getText().length());
    return true;
 
    }
 });

ListView更改背景后,移动出现黑色框的修改办法

android:cacheColorHint设置为透明(0x00000000)

获取当前程序进程ID,杀掉进程

int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);

如何动态的改变ImageView的背景?

有时候,我们为了在一个image view中显示不同的图片,往往会使用:

if (条件1) {
    image.setBackground(R.id.xxx1);
} else if (条件2) {
    image.setBackground(R.id.xxx2);
} ...

最近发现可以用另一个简便的方法实现相同的功能 首先,在res/drawable下建立一个xml文件,内容如下

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="0" android:drawable="@android:color/transparent" />
    <item android:maxLevel="1" android:drawable="@drawable/image_1" />
    <item android:maxLevel="2" android:drawable="@drawable/image_2" />
    <item android:maxLevel="3" android:drawable="@drawable/image_3" />
</level-list>

使用方法:

imageview.getDrawable().setLevel(0) //- 透明
imageview.getDrawable().setLevel(1) // - 显示image_1

android系统中用于显示电量的用法

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="29" android:drawable="@android:drawable/battery_charge_fill_empty" />
    <item android:maxLevel="49" android:drawable="@android:drawable/battery_charge_fill_warning" />
    <item android:maxLevel="100" android:drawable="@android:drawable/battery_charge_fill_full" />
</level-list>

从一个视图获得该视图的快照

 
		v.buildDrawingCache();
		Bitmap viewBitmap = v.getDrawingCache();

创建自定义属性的方法

自定义, 属性, attrs

1、在 attrs.xml 添加属性定义:

attrs.xml

1:     <declare-styleable name="GestureInflater">
2:         <attr name="id" format="reference" />
3:         <!-- the gesture action name, defined in strings.xml -->
4:         <attr name="title" format="string" />
5:         <!-- the gesture-bitmap name -->
6:         <attr name="name" format="string" />
7:     </declare-styleable>

2、 创建GestureInflater.java类, 用于解析xml文件

GestureInflater.java

 1:     public void inflate(int resId, List<GestureItem> items){
 2:         XmlResourceParser parser = null;
 3:         try {
 4:             parser = mContext.getResources().getLayout(resId);
 5:             AttributeSet attrs = Xml.asAttributeSet(parser);
 6:
 7:             parseXml(parser, attrs, items);
 8:         } catch (XmlPullParserException e) {
 9:             e.printStackTrace();
10:         } catch (IOException e) {
11:             e.printStackTrace();
12:         } finally {
13:             if (parser != null) parser.close();
14:         }
15:     }
16:
17:     private void parseXml(XmlResourceParser parser, AttributeSet attrs, List<GestureItem> items) throws XmlPullParserException, IOException{
18:         int eventType = parser.getEventType();
19:         String tagName;
20:
21:         do {
22:             if (eventType == XmlPullParser.START_TAG) {
23:                 tagName = parser.getName();
24:                 if (tagName.equals("gesture_config")) {
25:                     // Go to next tag
26:                     eventType = parser.next();
27:                     break;
28:                 }
29:
30:                 throw new RuntimeException("Expecting gesture_config, got " + tagName);
31:             }
32:             eventType = parser.next();
33:         } while (eventType != XmlPullParser.END_DOCUMENT);
34:
35:         boolean lookingForEndOfUnknownTag = false;
36:         String unknownTagName = null;
37:         boolean reachedEnd = false;
38:
39:         while (!reachedEnd) {
40:             switch (eventType) {
41:                 case XmlPullParser.START_TAG:
42:                     if (lookingForEndOfUnknownTag) {
43:                         break;
44:                     }
45:
46:                     tagName = parser.getName();
47:                     if (tagName.equals("item")) {
48:                         TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.GestureInflater);
49:                         GestureItem item = new GestureItem();
50:                         item.mId = a.getResourceId(R.styleable.GestureInflater_id, -1);
51:                         item.mTitle = a.getString(R.styleable.GestureInflater_title);
52:                         item.mName = a.getString(R.styleable.GestureInflater_name);
53:
54:                         Log.w("MxBrowser", "gesture id:"+item.mId+"; name="+item.mName+"; title="+item.mTitle);
55:
56:                         items.add(item);
57:                     } else {
58:                         lookingForEndOfUnknownTag = true;
59:                         unknownTagName = tagName;
60:                     }
61:                     break;
62:
63:                 case XmlPullParser.END_TAG:
64:                     tagName = parser.getName();
65:                     if (lookingForEndOfUnknownTag && tagName.equals(unknownTagName)) {
66:                         lookingForEndOfUnknownTag = false;
67:                         unknownTagName = null;
68:                     } else if (tagName.equals("item")) {
69:                         //end item;
70:                     }else if(tagName.equals("gesture_config")){
71:                         reachedEnd = true;
72:                     }
73:                     break;
74:
75:                 case XmlPullParser.END_DOCUMENT:
76:                     throw new RuntimeException("Unexpected end of document");
77:             }
78:
79:             eventType = parser.next();
80:         }
81:     }

3、在res/xml下创建自己的资源

 1: <?xml version="1.0" encoding="utf-8"?>
 2: <gesture_config xmlns:android="http://schemas.android.com/apk/res/android"
 3:     xmlns:gesture_config="http://schemas.android.com/apk/res/com.mx.browser">
 4:
 5:     <item gesture_config:id="@+id/gesture_settings" gesture_config:title="@string/gesture_open_gesture_settings"  gesture_config:name="gestureSettings" />
 6:     <item gesture_config:id="@+id/gesture_open_bookmark" gesture_config:title="@string/gesture_open_bookmark" gesture_config:name="openBookmark" />
 7:     <item gesture_config:id="@+id/gesture_add_bookmark" gesture_config:title="@string/gesture_add_bookmark" gesture_config:name="addBookmark" />
 8:     <item gesture_config:id="@+id/gesture_open_mostvisit" gesture_config:title="@string/gesture_most_visit" gesture_config:name="mostVisit" />
 9:     <item gesture_config:id="@+id/gesture_open_history" gesture_config:title="@string/gesture_open_history" gesture_config:name="openHistory" />
10:     <item gesture_config:id="@+id/gesture_new_tab" gesture_config:title="@string/gesture_new_tab" gesture_config:name="newTab" />
11:     <item gesture_config:id="@+id/gesture_prev_tab" gesture_config:title="@string/gesture_prev_tab" gesture_config:name="prevTab" />
12:     <item gesture_config:id="@+id/gesture_next_tab" gesture_config:title="@string/gesture_next_tab" gesture_config:name="nextTab" />
13:     <item gesture_config:id="@+id/gesture_close_tab" gesture_config:title="@string/gesture_close_tab" gesture_config:name="closeTab" />
14:     <item gesture_config:id="@+id/gesture_backward" gesture_config:title="@string/gesture_backward" gesture_config:name="backward" />
15:     <item gesture_config:id="@+id/gesture_forward" gesture_config:title="@string/gesture_foward" gesture_config:name="forward" />
16:     <item gesture_config:id="@+id/gesture_refresh" gesture_config:title="@string/gesture_refresh" gesture_config:name="refresh" />
17:     <item gesture_config:id="@+id/gesture_find_in_page" gesture_config:title="@string/gesture_find_in_page" gesture_config:name="findInPage" />
18:     <item gesture_config:id="@+id/gesture_select_text" gesture_config:title="@string/gesture_select_text" gesture_config:name="selectText" />
19:     <item gesture_config:id="@+id/gesture_share_url" gesture_config:title="@string/gesture_share_url" gesture_config:name="shareUrl" />
20:
21: </gesture_config>

gestureconfig.xml

这样, 我们就可以像系统组建一样使用我们自己的组建:

example.java

 1: GestureInflater inflater = new GestureInflater(context);
 2: inflater.inflate(R.xml.gestureconfig, ...);
 3: ... ...
 4:
 5: switch(gesture.getID){
 6:     case R.id.gesture_backword:
 7:         goBack();
 8:         break;
 9:
10:      ... ...
11: }

修改Dialog的背景透明度

Dialog dg = new Dialog(this);


Window window = dg.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.alpha = 0.5f;
        window.setAttributes(lp)

让Activity变成一个窗口

 讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很

简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义

Activity以对话框的形式弹出

android :theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"

Activity以半透明的方式弹出

android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"

将中文设置成粗体

在xml文件中使用android:textStyle=”bold” 可以将英文设置成粗体,但是不能将中文设置成粗体, 将中文设置成粗体的方法是: TextView tv = (TextView)findViewById(R.id.TextView01); TextPaint tp = tv.getPaint(); tp.setFakeBoldText(true);

如何在android adt环境下使用第三方java程序?

1. 为第三方java程序生成.jar文件

2. 选择当前android项目→build path→config-build path→Libraries→Add External jars

优化Dalvik虚拟机的堆内存

//用此方法优化gc的效率,参考android源码TARGET_HEAP_UTILIZATION
// 活动的对象的内存/堆的大小
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION)  //UTILIZATION = 0.75f
 
final static int HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(HEAP_SIZE); //调整堆内存

使用tcpdump在android手机上进行抓包

使用tcpdump在android手机上进行抓包

运行tcpdump具有root权限

  1. 下载tcpdump文件tcpdump文件tcpdump_001.zip
  2. adb push tcpdump /sdcard/tcpdump 安装文件
  3. adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap来进行抓包
  4. 使用 adb pull /sdcard/capture.pcap获取抓包数据
  5. 使用wireshark来查看抓包数据

使用系统生成的唯一id

在values/ids.xml中定义

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="button_ok" />
    <item type="id" name="dialog_exit" />
</resources>

使用时可以用showDialog(R.id.dialog_exit)

android修改Hosts文件

$su
#mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
echo "168.143.161.20 twitter.com www.twitter.com" >> /etc/hosts
mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system

在处理sqlite转义字符

SQLite, 转义字符

在 selection 中需要嵌入字符串的地方用 ? 代替,然后在 selectionArgs 中依次提供各个用于替换的值就可以了。在 query() 执行时会对 selectionArgs 中的字符串正确转义并替换到对应的 ? 处以构成完整的 selection 字符串。 有点像 String.format()。

public void doQuery(long id, final String name) {
  mDb.query("some_table", // table name
        null, // columns
        "id=" + id + " AND name=?", // selection
        new String[] {name}, //selectionArgs
         //...... 更多参数省略
  );
  // ...... 更多代码
}
}

如何查看padding和margin

如何向cursor写入数据

如何向一个cursor里添加额外的数据而又不改变数据库里的数据?

You can subclass SQLiteDatabase.CursorFactory to return, from its 
newCursor method, a subclass of SQLiteCursor. This factory gets passed 
to the SQLiteOpenHelper constructor so, when you query it, it will 
return Cursors of your new SQLiteCursor subclass type. 
The SQLiteCursor subclass can then expose methods that manage its 
protected mWindow field, which is a CursorWindow. This object has 
putXxx methods to manipulate the data. 
I haven't tried this myself, so if anyone has any tips or hints, 
please post. 

模拟器修改hosts文件

emulator -avd youravdname -partition-size 128
adb shell ping xx.xx.xx
adb root
adb remount
adb pull /system/etc/hosts /tmp/hosts
echo "192.168.1.32 xx.xx.xx" >> /tmp/hosts
adb push /tmp/hosts /system/etc/hosts
adb shell ping xx.xx.xx

如何获取指定类型的activity 列表 ?

有时候我们需要获取某一类activity的列表,如属性为 Intent.CATEGORY_LAUNCHER (可以启动的应用) 列表. 可以使用以下方法

 Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
 
        PackageManager pm = getPackageManager();
        List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);

发散思维: 我们可以自定义一类activity为我们的主activity服务.比如在插件系统中我们定义一个”com.mx.browser.plugin”的类别.

svn遇到is already under version control 解决办法?

解决办法:以uploads目录为例

删除uploads目录下的.svn目录及下面的文件(保留uploads目录的.svn) #find uploads |grep 'uploads/[^\.]*/.svn'|xargs rm -rf

当发生分支不能合并到主干时怎么办?

  1. 列出自己修改过的类
  2. 使用vimdiff工具,比较这些文件,合并很方便
  3. 检查合并过去的类

需要输入一个很长很长的网址时

  1. 在pc浏览器上输入http://qrcode.kaywa.com/img.php?s=5&d=加上你的网址
  2. 上面的结果会生成一个二维码,使用手机的二维码识别程序,识别就好了

svn修改账户

删除 eclipse/configuration/org.eclipse.core.runtime/.keyring

点击Dialog外部令Dialog自动消失

设置Dialog.setCanceledOnTouchOutside(true);



技巧篇

这里记录一些为分类的技巧

遇到ANR的解决方案

    adb pull /data/anr/traces.txt .

通过上面的命令,得到anr详细信息。可以从中找到线索解决这个问题。

adb 获取设备信息

adb shell getprop

adb shell dumpsys window | grep DisplayWidth

如何控制Activity的显示大小及位置?

通常情况下activity会覆盖整个屏幕,有时候我们需要控制activity的大小及显示位置,比如我们把一个activity设置为 “Theme.Dialog” 主题,同时希望其显示位置及大小也随我们控制。 可以通过下面在activity的 onCreate方法中加入以下代码满足我们的要求。 注:下面的代码必须放置在setContentView()方法之后。

    WindowManager m = getWindowManager();
        Display d = m.getDefaultDisplay();  //为获取屏幕宽、高
 
        LayoutParams p = getWindow().getAttributes();  //获取对话框当前的参数值
        p.height = (int) (d.getHeight() * 0.6);   //高度设置为屏幕的0.6
        p.width = (int) (d.getWidth() * 0.95);    //宽度设置为屏幕的0.95
        //p.x = 20;  设置顶点坐标
                //p.y= 30;
        getWindow().setAttributes(p);     //设置生效

如何弹出选择默认应用的对话框?

ResolverActivity, 默认浏览器

弹出所有支持的浏览器

                Intent intent = new Intent();
                intent.setAction("android.intent.action.VIEW");
                intent.addCategory(Intent.CATEGORY_BROWSABLE);
                Uri content_url = Uri.parse("http://3g.sina.cn");
                intent.setData(content_url);
                ComponentName com = new ComponentName("android",
                        "com.android.internal.app.ResolverActivity");
                intent.setComponent(com);

按包名过滤logcat调试信息

#!/bin/bash
packageName=$1
pid=`adb shell ps | grep $packageName | awk '{print $2}'`
adb logcat | grep --color=auto $pid

使用系统提供的组件进行截图

关键字:com.android.camera.action.CROP

android 的很多组件提供非常松散的调用,下面通过Intent实现截取图片的功能。

final Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera", "com.android.camera.CropImage");
intent.setData(Uri.fromFile(mFile));
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
intent.putExtra("aspectX", width);
intent.putExtra("aspectY", height);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true);
intent.putExtra("output", Uri.parse("file:/" + mFile.getAbsolutePath()));
startActivityForResult(intent, REQUEST_CROP_IMAGE);

如何使输入键盘不遮挡输入内容?

可以通过“ android:windowSoftInputMode“ 属性来控制输入键盘和输入窗口

android:windowSoftInputMode=“adjustPan” 显示输入键盘不调整主视图的大小

android:windowSoftInputMode=“adjustResize” 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间(主视图会被挤上去)

示例:

<activity android:name=".MxBrowserActivity"
            android:launchMode="singleTask" android:alwaysRetainTaskState="true"
            android:windowSoftInputMode="adjustPan" android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden">

如何获取系统已经安装组件的列表?

 PackageManager packageManager = this.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);

如何获取支持分享的组件列表?

     List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
     Intent intent=new Intent(Intent.ACTION_SEND,null);
     intent.addCategory(Intent.CATEGORY_DEFAULT);
     intent.setType("text/plain");
     PackageManager pManager = context.getPackageManager();
     mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
 
     return mApps;

如何判断程序启动是从最近任务列表(长按home键)开始?

有时我们需要知道程序被启动是从luncher还是从最近任务列表启动可以使用以下方法

intent来自桌面或最近任务列表

        final int flags = intent.getFlags();
        String action = intent.getAction();
       if (Intent.ACTION_MAIN.equals(action) ||(flags &   Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)  = 0) {
 
        }

Android UI 优化 使用<include/>和 <merge />标签

使用<include /> 标签来重用layout代码 如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码,该标签在android开发文档中没有相关的介绍。在android主屏程序中 用到了这个标签:

<com.android.launcher.Workspace
  android:id="@+id/workspace"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  launcher:defaultScreen="1">
  <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
  <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
  <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
 
</com.android.launcher.Workspace>

这样可以多次引用一个布局片段而不用重复的复制、粘贴。通过include标签也可以覆写一些属性的值,例如上面的示例就覆写了引用的layout中的id值。下面是另外一个示例:

<include android:layout_width="fill_parent" layout="@layout/image_holder" />
<include android:layout_width="256dip" layout="@layout/image_holder" />

使用<merge /> 标签来减少视图层级结构,在Android layout文件中需要一个顶级容器来容纳其他的组件,而不能直接放置多个组件,例如如下的代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Golden Gate" />
</FrameLayout>

单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构。 将通过一个例子来了解这个标签实际所产生的作用,这样可以更直观的了解<merge/>的用法。 建立一个简单的Layout,其中包含两个Views元素:ImageView和TextView 默认状态下我们将这两个元素放在FrameLayout中。其效果是在主视图中全屏显示一张图片,之后将标题显示在图片上,并位于视图的下方。以下是xml代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
 
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
 
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dip"
        android:layout_gravity="center_horizontal|bottom"
 
        android:padding="12dip"
 
        android:background="#AA000000"
        android:textColor="#ffffffff"
 
        android:text="Golden Gate" />
 
</FrameLayout>

应用上边的Layout运行的视图为:

启动 tools> hierarchyviewer.bat工具查看当前UI结构视图:

我们可以很明显的看到由红色线框所包含的结构出现了两个framelayout节点,很明显这两个完全意义相同的节点造成了资源浪费(这里可以提醒大家在开发工程中可以习惯性的通过hierarchyViewer查看当前UI资源的分配情况),那么如何才能解决这种问题呢(就当前例子是如何去掉多余的frameLayout节点)?这时候就要用到<merge />标签来处理类似的问题了。我们将上边xml代码中的framLayout替换成merge:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
 
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
 
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dip"
        android:layout_gravity="center_horizontal|bottom"
 
        android:padding="12dip"
 
        android:background="#AA000000"
        android:textColor="#ffffffff"
 
        android:text="Golden Gate" />
 
</merge>

运行程序后在Emulator中显示的效果是一样的,可是通过hierarchyviewer查看的UI结构是有变化的,当初多余的FrameLayout节点被合并在一起了,或者可以理解为将merge标签中的子集直接加到Activity的FrameLayout跟节点下(这里需要提醒大家注意:所有的Activity视图的根节点都是frameLayout)。如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能应用上边的例子通过merge来优化UI结构。

除了上边的例子外,meger还有另外一个用法,当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。

另外有两点需要特别注意:

<merge />只可以作为xml layout的根节点。 当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。(更多说明请参见inflate()文档)

如何调用系统浏览器打开一个网址?

am start -a android.intent.action.VIEW -d http://www.xiashou.net

如何通过命令行启动一个程序

adb shell am start -n com.google.android.contacts/.ContactsActivity

如何指定设备和模拟器

指定安装在真实设备

adb -d install abc.apk

指定安装在模拟器

adb -e install abc.apk

查看bug

adb bugreport

查看内核日志信息

adb shell dmesg

如何通过xml布局文件构建一个自定义的类?

对于public 属性的 类存在两种形式:

1

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    >
        <view class="com.test.MyView"
            android:id="@+id/myview"
            android:layout_height="5dip"
            android:layout_width="fill_parent"
 
            />
</LinearLayout>

2

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    >
        <com.test.MyView
            android:id="@+id/myview"
            android:layout_height="5dip"
            android:layout_width="fill_parent"
 
            />
</LinearLayout>

对于内部类我们可以采用下面的形式从布局文件构造

<!-- 其中SubView是MyView的子类-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    >
        <view class="com.test.MyView$SubView"
            android:id="@+id/SubView"
            android:layout_height="5dip"
            android:layout_width="fill_parent"
            />
</LinearLayout>

自定义视图代码结构如下

class MyClass extend View
{
   private static class SubView extends View {
   }
}

通过xml构造绘制一个动态图像

我们可以直接通过xml构造一个动态的Drawable对象,xml描述如下

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_black_16"
    android:pivotX="50%"
    android:pivotY="50%"
    android:framesCount="12"
    android:frameDuration="100" />

使用代码如下

mCircularProgress = (Drawable) resources.getDrawable(
                com.android.internal.R.drawable.search_spinner);
//set drawable to view
 
((Animatable) mCircularProgress).start();
((Animatable) mCircularProgress).stop();

相关TAG:AnimationDrawable

 AnimationDrawable

此方式在android 2.1下支持

如何隐藏输入法对话框?

    InputMethodManager imm = (InputMethodManager)
        getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
       imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);

如何阻止编辑框弹出输入法对话框?

editText.setOnTouchListener(new OnTouchListener() {
 
 public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    //记住EditText的InputType现在是password
    int inType = editText.getInputType(); // backup the input type
    editText.setInputType(InputType.TYPE_NULL); // disable soft input
    editText.onTouchEvent(event); // call native handler
    editText.setInputType(inType); // restore input type
    editText.setSelection(editText.getText().length());
    return true;
 
    }
 });

ListView更改背景后,移动出现黑色框的修改办法

android:cacheColorHint设置为透明(0x00000000)

获取当前程序进程ID,杀掉进程

int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);

如何动态的改变ImageView的背景?

有时候,我们为了在一个image view中显示不同的图片,往往会使用:

if (条件1) {
    image.setBackground(R.id.xxx1);
} else if (条件2) {
    image.setBackground(R.id.xxx2);
} ...

最近发现可以用另一个简便的方法实现相同的功能 首先,在res/drawable下建立一个xml文件,内容如下

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="0" android:drawable="@android:color/transparent" />
    <item android:maxLevel="1" android:drawable="@drawable/image_1" />
    <item android:maxLevel="2" android:drawable="@drawable/image_2" />
    <item android:maxLevel="3" android:drawable="@drawable/image_3" />
</level-list>

使用方法:

imageview.getDrawable().setLevel(0) //- 透明
imageview.getDrawable().setLevel(1) // - 显示image_1

android系统中用于显示电量的用法

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="29" android:drawable="@android:drawable/battery_charge_fill_empty" />
    <item android:maxLevel="49" android:drawable="@android:drawable/battery_charge_fill_warning" />
    <item android:maxLevel="100" android:drawable="@android:drawable/battery_charge_fill_full" />
</level-list>

从一个视图获得该视图的快照

 
		v.buildDrawingCache();
		Bitmap viewBitmap = v.getDrawingCache();

创建自定义属性的方法

自定义, 属性, attrs

1、在 attrs.xml 添加属性定义:

attrs.xml

1:     <declare-styleable name="GestureInflater">
2:         <attr name="id" format="reference" />
3:         <!-- the gesture action name, defined in strings.xml -->
4:         <attr name="title" format="string" />
5:         <!-- the gesture-bitmap name -->
6:         <attr name="name" format="string" />
7:     </declare-styleable>

2、 创建GestureInflater.java类, 用于解析xml文件

GestureInflater.java

 1:     public void inflate(int resId, List<GestureItem> items){
 2:         XmlResourceParser parser = null;
 3:         try {
 4:             parser = mContext.getResources().getLayout(resId);
 5:             AttributeSet attrs = Xml.asAttributeSet(parser);
 6:
 7:             parseXml(parser, attrs, items);
 8:         } catch (XmlPullParserException e) {
 9:             e.printStackTrace();
10:         } catch (IOException e) {
11:             e.printStackTrace();
12:         } finally {
13:             if (parser != null) parser.close();
14:         }
15:     }
16:
17:     private void parseXml(XmlResourceParser parser, AttributeSet attrs, List<GestureItem> items) throws XmlPullParserException, IOException{
18:         int eventType = parser.getEventType();
19:         String tagName;
20:
21:         do {
22:             if (eventType == XmlPullParser.START_TAG) {
23:                 tagName = parser.getName();
24:                 if (tagName.equals("gesture_config")) {
25:                     // Go to next tag
26:                     eventType = parser.next();
27:                     break;
28:                 }
29:
30:                 throw new RuntimeException("Expecting gesture_config, got " + tagName);
31:             }
32:             eventType = parser.next();
33:         } while (eventType != XmlPullParser.END_DOCUMENT);
34:
35:         boolean lookingForEndOfUnknownTag = false;
36:         String unknownTagName = null;
37:         boolean reachedEnd = false;
38:
39:         while (!reachedEnd) {
40:             switch (eventType) {
41:                 case XmlPullParser.START_TAG:
42:                     if (lookingForEndOfUnknownTag) {
43:                         break;
44:                     }
45:
46:                     tagName = parser.getName();
47:                     if (tagName.equals("item")) {
48:                         TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.GestureInflater);
49:                         GestureItem item = new GestureItem();
50:                         item.mId = a.getResourceId(R.styleable.GestureInflater_id, -1);
51:                         item.mTitle = a.getString(R.styleable.GestureInflater_title);
52:                         item.mName = a.getString(R.styleable.GestureInflater_name);
53:
54:                         Log.w("MxBrowser", "gesture id:"+item.mId+"; name="+item.mName+"; title="+item.mTitle);
55:
56:                         items.add(item);
57:                     } else {
58:                         lookingForEndOfUnknownTag = true;
59:                         unknownTagName = tagName;
60:                     }
61:                     break;
62:
63:                 case XmlPullParser.END_TAG:
64:                     tagName = parser.getName();
65:                     if (lookingForEndOfUnknownTag && tagName.equals(unknownTagName)) {
66:                         lookingForEndOfUnknownTag = false;
67:                         unknownTagName = null;
68:                     } else if (tagName.equals("item")) {
69:                         //end item;
70:                     }else if(tagName.equals("gesture_config")){
71:                         reachedEnd = true;
72:                     }
73:                     break;
74:
75:                 case XmlPullParser.END_DOCUMENT:
76:                     throw new RuntimeException("Unexpected end of document");
77:             }
78:
79:             eventType = parser.next();
80:         }
81:     }

3、在res/xml下创建自己的资源

 1: <?xml version="1.0" encoding="utf-8"?>
 2: <gesture_config xmlns:android="http://schemas.android.com/apk/res/android"
 3:     xmlns:gesture_config="http://schemas.android.com/apk/res/com.mx.browser">
 4:
 5:     <item gesture_config:id="@+id/gesture_settings" gesture_config:title="@string/gesture_open_gesture_settings"  gesture_config:name="gestureSettings" />
 6:     <item gesture_config:id="@+id/gesture_open_bookmark" gesture_config:title="@string/gesture_open_bookmark" gesture_config:name="openBookmark" />
 7:     <item gesture_config:id="@+id/gesture_add_bookmark" gesture_config:title="@string/gesture_add_bookmark" gesture_config:name="addBookmark" />
 8:     <item gesture_config:id="@+id/gesture_open_mostvisit" gesture_config:title="@string/gesture_most_visit" gesture_config:name="mostVisit" />
 9:     <item gesture_config:id="@+id/gesture_open_history" gesture_config:title="@string/gesture_open_history" gesture_config:name="openHistory" />
10:     <item gesture_config:id="@+id/gesture_new_tab" gesture_config:title="@string/gesture_new_tab" gesture_config:name="newTab" />
11:     <item gesture_config:id="@+id/gesture_prev_tab" gesture_config:title="@string/gesture_prev_tab" gesture_config:name="prevTab" />
12:     <item gesture_config:id="@+id/gesture_next_tab" gesture_config:title="@string/gesture_next_tab" gesture_config:name="nextTab" />
13:     <item gesture_config:id="@+id/gesture_close_tab" gesture_config:title="@string/gesture_close_tab" gesture_config:name="closeTab" />
14:     <item gesture_config:id="@+id/gesture_backward" gesture_config:title="@string/gesture_backward" gesture_config:name="backward" />
15:     <item gesture_config:id="@+id/gesture_forward" gesture_config:title="@string/gesture_foward" gesture_config:name="forward" />
16:     <item gesture_config:id="@+id/gesture_refresh" gesture_config:title="@string/gesture_refresh" gesture_config:name="refresh" />
17:     <item gesture_config:id="@+id/gesture_find_in_page" gesture_config:title="@string/gesture_find_in_page" gesture_config:name="findInPage" />
18:     <item gesture_config:id="@+id/gesture_select_text" gesture_config:title="@string/gesture_select_text" gesture_config:name="selectText" />
19:     <item gesture_config:id="@+id/gesture_share_url" gesture_config:title="@string/gesture_share_url" gesture_config:name="shareUrl" />
20:
21: </gesture_config>

gestureconfig.xml

这样, 我们就可以像系统组建一样使用我们自己的组建:

example.java

 1: GestureInflater inflater = new GestureInflater(context);
 2: inflater.inflate(R.xml.gestureconfig, ...);
 3: ... ...
 4:
 5: switch(gesture.getID){
 6:     case R.id.gesture_backword:
 7:         goBack();
 8:         break;
 9:
10:      ... ...
11: }

修改Dialog的背景透明度

Dialog dg = new Dialog(this);


Window window = dg.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.alpha = 0.5f;
        window.setAttributes(lp)

让Activity变成一个窗口

 讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很

简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义

Activity以对话框的形式弹出

android :theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"

Activity以半透明的方式弹出

android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"

将中文设置成粗体

在xml文件中使用android:textStyle=”bold” 可以将英文设置成粗体,但是不能将中文设置成粗体, 将中文设置成粗体的方法是: TextView tv = (TextView)findViewById(R.id.TextView01); TextPaint tp = tv.getPaint(); tp.setFakeBoldText(true);

如何在android adt环境下使用第三方java程序?

1. 为第三方java程序生成.jar文件

2. 选择当前android项目→build path→config-build path→Libraries→Add External jars

优化Dalvik虚拟机的堆内存

//用此方法优化gc的效率,参考android源码TARGET_HEAP_UTILIZATION
// 活动的对象的内存/堆的大小
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION)  //UTILIZATION = 0.75f
 
final static int HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(HEAP_SIZE); //调整堆内存

使用tcpdump在android手机上进行抓包

使用tcpdump在android手机上进行抓包

运行tcpdump具有root权限

  1. 下载tcpdump文件tcpdump文件tcpdump_001.zip
  2. adb push tcpdump /sdcard/tcpdump 安装文件
  3. adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap来进行抓包
  4. 使用 adb pull /sdcard/capture.pcap获取抓包数据
  5. 使用wireshark来查看抓包数据

使用系统生成的唯一id

在values/ids.xml中定义

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="button_ok" />
    <item type="id" name="dialog_exit" />
</resources>

使用时可以用showDialog(R.id.dialog_exit)

android修改Hosts文件

$su
#mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
echo "168.143.161.20 twitter.com www.twitter.com" >> /etc/hosts
mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system

在处理sqlite转义字符

SQLite, 转义字符

在 selection 中需要嵌入字符串的地方用 ? 代替,然后在 selectionArgs 中依次提供各个用于替换的值就可以了。在 query() 执行时会对 selectionArgs 中的字符串正确转义并替换到对应的 ? 处以构成完整的 selection 字符串。 有点像 String.format()。

public void doQuery(long id, final String name) {
  mDb.query("some_table", // table name
        null, // columns
        "id=" + id + " AND name=?", // selection
        new String[] {name}, //selectionArgs
         //...... 更多参数省略
  );
  // ...... 更多代码
}
}

如何查看padding和margin

如何向cursor写入数据

如何向一个cursor里添加额外的数据而又不改变数据库里的数据?

You can subclass SQLiteDatabase.CursorFactory to return, from its 
newCursor method, a subclass of SQLiteCursor. This factory gets passed 
to the SQLiteOpenHelper constructor so, when you query it, it will 
return Cursors of your new SQLiteCursor subclass type. 
The SQLiteCursor subclass can then expose methods that manage its 
protected mWindow field, which is a CursorWindow. This object has 
putXxx methods to manipulate the data. 
I haven't tried this myself, so if anyone has any tips or hints, 
please post. 

模拟器修改hosts文件

emulator -avd youravdname -partition-size 128
adb shell ping mm.maxthon.cn
adb root
adb remount
adb pull /system/etc/hosts /tmp/hosts
echo "192.168.1.32 mm.maxthon.cn" >> /tmp/hosts
adb push /tmp/hosts /system/etc/hosts
adb shell ping mm.maxthon.cn

如何获取指定类型的activity 列表 ?

有时候我们需要获取某一类activity的列表,如属性为 Intent.CATEGORY_LAUNCHER (可以启动的应用) 列表. 可以使用以下方法

 Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
 
        PackageManager pm = getPackageManager();
        List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);

发散思维: 我们可以自定义一类activity为我们的主activity服务.比如在插件系统中我们定义一个”com.mx.browser.plugin”的类别.

svn遇到is already under version control 解决办法?

解决办法:以uploads目录为例

删除uploads目录下的.svn目录及下面的文件(保留uploads目录的.svn) #find uploads |grep 'uploads/[^\.]*/.svn'|xargs rm -rf

当发生分支不能合并到主干时怎么办?

  1. 列出自己修改过的类
  2. 使用vimdiff工具,比较这些文件,合并很方便
  3. 检查合并过去的类

需要输入一个很长很长的网址时

  1. 在pc浏览器上输入http://qrcode.kaywa.com/img.php?s=5&d=加上你的网址
  2. 上面的结果会生成一个二维码,使用手机的二维码识别程序,识别就好了

svn修改账户

删除 eclipse/configuration/org.eclipse.core.runtime/.keyring

点击Dialog外部令Dialog自动消失

设置Dialog.setCanceledOnTouchOutside(true);


未隔离电源设备使用usb转串口调试导致串口模块爆炸烧坏事故记录 这个事就发生在前两天,我们公司的wifi模块被客户用到了咖啡机上,客户寄了一台整机给我们协助调试,还送了几包咖啡豆,本想着还能打个咖啡喝一喝的,但就在咖啡机刚寄过来第一天,就出事了。而这个事故的发生,竟然仅仅是因为同事接了个串口模块到电脑调试打印导致的。谁也想不到,这个3.3V的供电的wifi模块居然还有这么大的威力。直接将usb转TTL串口模块的转换芯片给爆开了,咖啡机也给弄坏了,据同事描述当时情况就只见到一片火光和一声巨响,状况比较惨烈,所幸的是笔记本电脑没有烧坏,但是直接给崩蓝屏了。 ... 阅读详情

相关推荐

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1786

Android源码分析-PackageManagerService(PMS)源码分析(三)- queryIntentActivities函数来查找activity

queryIntentActivities函数的作用: 在Android应用程序开发中,用startActivity可以开启另外一个Activity或应用。startActivity函数必须包含Intent参数,这个参数用来指定具体要打开的组件。

记录和分享程序人生的点点滴滴 5040

C语言的文件读取与写入操作

学了一年的C语言了,现在回过头来做一下总结。并且博客开了挺长一段时间却没有谢什么实际的东西。现在做下总结,对之后的学习帮助应该挺大的。与大家共勉! 现在,我先来介绍一下C语言的文件读取与写入的原理和具体操作方法。 C语言文件读取与写入是通过将文件看成一个字符序列进行读入和写出的。所以读取与写入文件就用到了指针,而这个指针是一个特殊的指针,我们称为文件指针。 指针名称是

wzyxdwll的博客 3万+

使用 queryIntentActivities 获取应用名称和包名

使用 queryIntentActivities 获取应用名称和包名 intent.addCategory(Intent.CATEGORY_LAUNCHER);// 桌面启动属性 mResolveInfos = mPackageManager.queryIntentActivities(intent,PackageManager.MATCH_ALL); // 使用 queryIntentA...

苏法迪的专栏 1万+

CST 仿真_NFC仿真

在CST中实现NFC天线单体的仿真

qq_43706810的博客 3961

小白快速上手 labelimg:新手图像标注详解教程

本教程主要帮助没有使用过labelimg的小白上手该软件,快速学会基本操作和打标签,为数据集准备打下基础。

小白一枚~ 2万+

Android -- queryIntentActivities

某些时候你想要知道某个APP是否有注册了一个明确的intent,比如说你想要检查某个receiver是否存在,然后根据是否存在来这个receiver来在你的AP里面enable某些功能。我们可以通过PackageManager来check它。 code public boolean isIntentAvailable(Context context, String action) { ...

weixin_34126215的博客 737

数据行小于列索引,内部模式表示可能存在问题

通过检查数据源的完整性和一致性,检查Debezium配置,检查列映射以及启用调试模式和日志记录,您应该能够解决这个错误。请注意,具体的解决方法可能因您的具体情况而异,因此您可能需要根据问题的根本原因进行适当的调整和修复。如果问题仍然存在,您可能需要进一步检查您的数据和配置,并根据具体情况进行调整和修复。在Debezium中,您可以使用列重命名和列映射来定义源和目标之间的列映射关系。通过检查日志,您可以查看详细的错误信息和堆栈跟踪,从而更好地理解问题的根本原因。首先,我们应该检查数据源的完整性和一致性。

XbtoMemory的博客 730

Android Framework 包管理子系统(05)intent查询组件

系列文章解读&说明: Android Framework 包管理子系统(后面简称PkgMS)的分析主要分为以下部分: Android Framework 包管理子系统(01)PackageManagerService启动分析 Android Framework 包管理子系统(02)PackageManagerService关键文件解读 Android Framework 包管理子系...

wangdsh的博客 1322

点云从入门到精通技术详解100篇-点云的特征检测(续)

对每个维度的序列分别计算 DTW 距离,最后。权重将距离限制在较小的范围内,对于时间跨度大的数据集,过度限制了点对点的路径,同的,因此不能用欧氏距离来计算两个多元时间序列之间的距离,本文选用的是动态时。到的股票数据是未知分类的,因此该数据的相似性分析缺少有效的评价方式,通常需要。时间序列,简而言之,就是与时间相关的数据的集合,应用在生活工作中的方方面。时间序列的分段线性化表示的难点在于如何找出分段点,目前,对于分段点的研究。经过分段线性化之后,每个多元时间序列的维度是相同的,但是每一维的长度是不。

getusushu的博客 334

第14.8章 高翔博士最新开源框架Lightning-LM源码解读(八):位姿平滑器PoseSmoother深度剖析,从原理到代码实现

本文深度解析了高翔博士开源框架Lightning-LM中的位姿平滑器PoseSmoother模块。该模块通过设置平滑因子,在保证位姿准确性的同时减少突变,使位姿变化更平稳。文章详细讲解了模块功能、数据流程和核心代码实现,包括构造函数、拷贝构造函数以及关键的PushDRPose和PushPose函数。重点分析了位姿平滑算法原理,涉及运动有效性校验、位姿队列维护和平滑因子调节等核心机制。此外还介绍了相关C++语法(如显式构造函数、默认拷贝构造)和优化方向。本解析为SLAM学习者提供了位姿平滑处理的实用实现范例。

行知SLAM 600

Android通过queryIntentActivities自定义发送功能

Android通过queryIntentActivities自定义发送功能一、目标1. 实现效果2. 下载地址二、功能设计三、准备工作1. 查询列表2. 处理排序3. 启动指定的Activity四、组合起来1. ResolveProvider2. ResolveViewHolder3. ResolveEntity4. ResolveComparator五、Final 一、目标 自定义发送功能,使列...

济沧海 x 远沧溟 2533

关于如何在matlab中导入并翻译Hypemesh导出的大型刚度矩阵txt文本

如何将它翻译成matlab可以使用的矩阵变量,并参与运算。 由于这个大型刚度矩阵125万x125万≈1e12。matlab甚至其他计算软件无法保存这个大的一个矩阵文件。而这个刚度矩阵作为稀疏矩阵其中非零元素的数目只有有500多万。采用sparse稀疏矩阵技术是可以保存。 这里简单介绍一下这个Hypemesh导出的大型刚度矩阵txt文本。如图DMIG开头的标识符是换行符,后面两列是表示这条非零元素在刚度矩阵中列数的信息。我们已经将左边字母和符号等批量删除,得到了右边textread函数可以...

wenyusuran的专栏 1795

android 高级技巧,安卓手机用户必须知道的8个高级技巧,现在设置还来得及

安卓手机的用户量相当庞大。大家拿到心爱的手机后,除了使用电话和短信功能外,就开始连接WiFi,安装各种手机APP,却往往忽略了系统自身的强大功能。作为一个安卓系统的死忠粉,小编今天整理了8个实用的高级技巧,与大家分享。以下技巧,在安卓系统中都亲测可用,至于苹果系统有没有这些功能,就看读者留言罗。小编的手机型号是华为P9。高级功能一:通知中心在通知中心中,可为每个应用设置通知的情况。可以设置是否允许...

weixin_35025310的博客 1307

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

50 个安卓开发者应该熟悉的 android studio 技巧和资源

https://juejin.im/entry/582c16b1c4c9710054354e77

zhengyongbo的博客 489

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 界面布局教程,安卓页面布局技巧

安卓布局技巧1.include2.最外层为FrameLayout以及不用考虑background时使用merge(合并)3.用TextView同时显示图片和文字xml: drawableTop、drawableLeft.....代码:setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)4...

weixin_31968223的博客 854

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【安卓】Android开发技巧

KeyPromoter 快捷键提示插件 -- 试用了一下,就是你点击的时候有些按钮会出来提示框告诉你这个的快捷键是什么以及你使用的次数,还不错,目的就是让你进行键盘流操作。 String Manipulation 提供 Action 转换大小写什么的,感觉想不起来用。 Lines Sorter Add Sort Lines acti...

Extends的博客 277

Android安卓进阶技巧之——Android Service 服务

’ 一、 Service简介 Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。 Service的

m0_58479348的博客 1万+

提高android 运行效率,提高安卓手机运行速度的6个技巧

您可能感兴趣的话题:安卓手机核心提示:提高安卓手机运行速度的6个技巧,一起看看吧!很多安卓手机用户都会遇到智能手机使用一年、两年之后,运行速度就会变得非常慢。那么,用久了的安卓手机有没有可以提高手机运行速度的方法呢?今天,小编就为大家介绍提高手机运行速度的6种方法,他们包括了:浏览器清理法、换卡法以及清理临时文件等。一起来了解一下吧!1、文件传送法把信息的存储指定到机器存储,然后看自己的机器内存有...

weixin_39994627的博客 1304

Android安卓全面解析 ADB(Android Debug Bridge):命令、工具与实用技巧

本文深入介绍了 ADB(Android Debug Bridge) 工具,涵盖其安装、配置、常用命令及高级技巧,旨在帮助开发者和逆向工程师有效地与安卓设备交互。通过掌握ADB,你可以执行如安装应用、调试、设备管理、文件传输、屏幕录制等任务,同时深入分析安卓系统的工作原理。本文不仅适合 Android 开发者,也为进行安卓逆向分析的人员提供了丰富的命令参考和实战经验。无论是自动化测试还是逆向破解,ADB 都是不可或缺的利器。

Jet_58的博客 1323

Android小技巧,快手安卓面试

工欲行其事,必先利其器 1.B4A B4A是Android的基础版,这是一种可简化编程的Android的应用程序开发工具。这是一个IDE,可以允许开发者使用Basic语言来创建Android移动应用。Basic语言是一种过程化编程语言,因为其简单易学,几乎普通的英语就可以写代码。B4A还有一些有意思的功能,比如通过蓝牙调试,自定义应用程序视图,可视化编辑器等。 使用B4A开发,几乎可以完成所有的事情,并且比 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》 Androi

m0_68838647的博客 283

出售安卓设备前的数据清除技巧

在出售或转让旧手机时,一个重要的步骤就是确保个人数据的安全清除。这不仅是对自己隐私的保护,也是对数据接收方的负责。今天,我们就来介绍一款专业而高效的数据清除工具——Coolmuster Android Eraser,以及一些出售安卓设备前的数据清除技巧。

Coolmuster的博客 1237

安卓开发中的一些实用小技巧

1.去除状态栏和标题栏:2.TextView实现跑马灯(文字滚动显示)效果:3.禁止转屏:4.根据按钮(或者其他组件)的状态显示不同背景图片:5.双击back键退出activity(也就是第二次时才执行原back方法):

zhang___yong的博客 541

android8手机 使用方法,技巧丨8条使用技巧, 让你手机更安全(安卓篇)!

原标题:技巧丨8条使用技巧, 让你手机更安全(安卓篇)!随着安卓手机用户越来越多, 安卓系统开源的特点,也引起了大众对手机安全的关注。今天,小编就为大家收集了安卓手机十大安全注意事项,希望能为你解疑释惑!1下载官方开发者认证的应用很多不合格的应用和垃圾应用都会涉及要求获取用户隐私权限。在应用市场下载安装软件时,很多用户会跳过查看应用权限这一步,这么做就让这些应用轻易拿到了你的隐私,很危险!所以下载...

weixin_33236271的博客 536

安卓应用内WebView页面调试技巧

安卓应用内WebView页面调试技巧

前端金牌摸鱼达人 3544

android壁纸和手机屏幕之间要怎么对应,安卓Android手机屏幕壁纸分辨率选择技巧...

安卓Android手机屏幕壁纸分辨率选择技巧现在使用安卓手机的人好多了,一个好的手机壁纸自然是大家的追求,那么要怎么挑选适合自己安卓手机的手机壁纸呢~登博教程小编来教你挑选吧~大家先看看对应的壁纸分辨率:屏幕分辨率为 480×320 的Android手机,对应的壁纸分辨率为:640x480。屏幕分辨率为 800×480 的Android手机,对应的壁纸分辨率为:960x800。屏幕分辨率为 960...

weixin_36436373的博客 1296
上一篇: 在android源码中调试系统浏览器代码
下一篇: 十六进制字符串转换成int方法
javalive09
博客等级 码龄16年 43粉丝 281原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值