一路追梦想

热爱技术,更热爱生活


  • 首页

  • 关于

  • 标签

  • 归档

OpenSuSE13.2添加Android Studio到应用程序列表

发表于 2014-12-14 | 分类于 Linux

现在Android Studio 1.0版本正式发布以后,感觉体验比以前好了很多,所以也可以正式抛弃Eclipse,彻底改用Android Studio了

Linux下安装Android Studio很简单,就是到官网下载安装包,然后解压就可以了,然后到对应的Android Studio解压目录找到bin文件夹下面的studio.sh脚本,在终端中执行./studio.sh就可以启动了(前提是安装并配置好了JDK环境)

但是每次都在终端下到指定目录运行脚本启动也挺麻烦的,所以就要加入到应用程序列表中,可以直接搜索或者添加OpenSuSE左边的收藏栏中,如何将Android Studio添加到应用程序列表呢,很简单:

  1. 到/usr/share/applications/目录下面

  2. 执行vim studio.desktop命令

  3. 加入如下代码

    1
    2
    3
    4
    5
    6
    7
    8
    [Desktop Entry]
    Categories=Application;Development
    Name=Studio
    Exec=/home/caobin/android-studio/bin/studio.sh
    Icon=/home/caobin/android-studio/bin/idea.png
    Terminal=false
    Encoding=UTF-8
    Comment=Android Studio

上面代码中Exec和Icon代表执行文件路径和图标路径,具体替换为自己实际的路径即可

这样就算OK了,你ALT+F1打开OpenSuSE的应用程序搜索,然后输入Studio就可以看到下面出来了Android Studio的图标,右键选择添加到收藏栏或者直接打开都可以,这样以后启动就很方面了。你也可以将Android Studio的路径加入到PATH中,这样可以在任意地方打开Android Studio了,不用再到指定了安装目录了

又大了一岁

发表于 2014-11-29 | 分类于 Twitter

今年因为闰九月的缘故,自己的23岁生日好像晚来了一些
今天生日,女朋友给送了一个机械键盘,第一次使用机械键盘,感觉就是不一样,非常感谢女朋友
话说转眼都23周岁了,工作一年多了,很热爱编程这份工作,加油

Android4.0以上版本自定义Titlebar遇到的坑

发表于 2014-11-02 | 分类于 Android

虽然Android原生的控件是越来越完善和强大,但是很多时候还是需要我们自定义一些控件来让我们开发的app看起来很好看,让人舒服,比如android4.0以上默认的edittext我就觉得不好看,没有边角,还是喜欢那种四周有边角的看起来让人舒服,当然这个不同主题下显示效果是不一样的。题外话就扯到这里吧,现在进入正题:

Titlebar就是Activity最上面显示app name的那个东东,今天在coding的时候遇到一个需要自定义titlebar的,当然这个很简单了,就是自己根据需要写一个布局然后替换掉默认的titlebar就可以了,替换代码baidu一下有很多,简单的说就是在activity的onCreate方法中加入下面两句:

  1. 告诉activity我要使用自己定义的titlebar,不用你默认的

    1
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
  2. 让activity加载自己定义的titlebar的布局

    1
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);

然后在manifest中自定义titlebar的那个activity中加入自定义的theme,贴上我自定义theme的代码,我使用的是4.4的版本

1
2
3
4
5
6
7
<style name="HomePage" parent="AppTheme">
<item name="android:windowTitleSize">60dp</item>
<item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
</style>
<style name="WindowTitleBackground">
<item name="android:background">@color/blue</item>
</style>

第一个坑,报如下错误:

阅读全文 »

Linux下开机自动挂载samba目录,且可以正常读写

发表于 2014-10-30 | 分类于 Linux

因为现在基本都在Linux下活动了,工作中有需要用到编译服务器,每次进入linux之后再用mount命令手动挂载也挺麻烦的,而且手动挂载的话,每次都要重新将服务器目录的代码导入到source insight,麻烦极了,严重降低了生产效率。

那么问题就来了,如何能够开机自动挂载samba目录呢,google或者baidu一下你会发现各种各样的方法,大致可以分为两类:

  • 将mount命令写入到脚本中,开机自动加载脚本
  • 修改fstab

第一种方法我没有试过,我用的第二种方法,但是也遇到很多坑,写下来让需要的网友不用走那么多弯路

首先我们知道挂载samba目录的mount命令是:

1
mount -t cifs //172.20.4.189/home /mnt/myshare -o username=caobin

-o代表后面可以跟很多参数,比如password啊,iocharset之类的,以,分割,运行完该命令之后,如果有密码会提示让输入密码的,也可以直接将密码以password=xxx的形式放到-o后面

阅读全文 »

博客搬家

发表于 2014-10-11 | 分类于 Twitter

将自己的博客从emlog搬到wordpress了,数据库导入真的是件复杂的事啊,头都大了。

异步获取网络图片和BitmapFactory.Options缩放图片

发表于 2014-06-30 | 分类于 Android

As we all know,when Android applications load a picture with high resolution,it’s prone to occur OOM.This is caused due to memory overflow…

在Android开发的过程中,我们在新建AVD(Android Virtual Devices)的时候知道对应的设备不同分配的固定堆内存大小是不一样的,一般低分辨率的手机堆内存大小是16M,高一点分辨率的就是32M,然后更高分辨率的有64M的,Android TV(720P)的就是默认堆内存大小64,但是Android TV(1080P)的默认堆内存大小就是128M。之所以会出现OOM,是因为Android加载图片是把位图放到内存中,位图都是由一个个小的像素点组成,位图的大小与像素点所占的字节有关系,而每个像素点在内存中所占的字节大小是和位图的一个Bitmap.Config属性有关系的,Bitmap.Config枚举类有四个常见的枚举值。我们通过查看Android源码Bitmap类,可以看到其中有如下一个内部枚举类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public enum Config {
// these native values must match up with the enum in SkBitmap.h
/**
* Each pixel is stored as a single translucency (alpha) channel.
* This is very useful to efficiently store masks for instance.
* No color information is stored.
* With this configuration, each pixel requires 1 byte of memory.
*/
ALPHA_8 (2),
/**
* Each pixel is stored on 2 bytes and only the RGB channels are
* encoded: red is stored with 5 bits of precision (32 possible
* values), green is stored with 6 bits of precision (64 possible
* values) and blue is stored with 5 bits of precision.
*
* This configuration can produce slight visual artifacts depending
* on the configuration of the source. For instance, without
* dithering, the result might show a greenish tint. To get better
* results dithering should be applied.
*
* This configuration may be useful when using opaque bitmaps
* that do not require high color fidelity.
*/
RGB_565 (4),
/**
* Each pixel is stored on 2 bytes. The three RGB color channels
* and the alpha channel (translucency) are stored with a 4 bits
* precision (16 possible values.)
*
* This configuration is mostly useful if the application needs
* to store translucency information but also needs to save
* memory.
*
* It is recommended to use {@link #ARGB_8888} instead of this
* configuration.
*
* Note: as of {@link android.os.Build.VERSION_CODES#KITKAT},
* any bitmap created with this configuration will be created
* using {@link #ARGB_8888} instead.
*
* @deprecated Because of the poor quality of this configuration,
* it is advised to use {@link #ARGB_8888} instead.
*/
@Deprecated
ARGB_4444 (5),
/**
* Each pixel is stored on 4 bytes. Each channel (RGB and alpha
* for translucency) is stored with 8 bits of precision (256
* possible values.)
*
* This configuration is very flexible and offers the best
* quality. It should be used whenever possible.
*/
ARGB_8888 (6);

final int nativeInt;

@SuppressWarnings({"deprecation"})
private static Config sConfigs[] = {
null, null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888
};

Config(int ni) {
this.nativeInt = ni;
}

static Config nativeToConfig(int ni) {
return sConfigs[ni];
}
}

阅读全文 »

Android智能电视待机流程分析

发表于 2014-05-03 | 分类于 Android

上一篇简单分析了Android原生的待机流程,这一篇分析一下我们康佳智能电视的STR待机流程。智能电视的待机流程和Android原生的还是有一些差别的。STR是Suspend to RAM的缩写,顾名思义就是挂起到内存。所以我们官方给STR待机起的名字叫做快速待机,也就是待机时间快,待机起来之后还会会到待机前的状态

OK,言归正传,同样我们先把大致的流程图贴出来

智能电视是通过遥控器上的待机键来使电视待机的,当用户按下Power key的时候,会在interceptKeyBeforeQueueing中拦截判断,代码片段如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int keyCode = event.getKeyCode();
if (enable_str == true) {
if ("1".equals(SystemProperties.get("mstar.str.suspending"))) {
Log.d(TAG, "STR forbid keyCode=" + keyCode + ",down=" +down);
return 0;
}
if ("2".equals(SystemProperties.get("mstar.str.suspending"))) {
//Fake key for STR power on
if (keyCode == KeyEvent.KEYCODE_TV_POWER) {
Log.d(TAG, "STR dc on down=" + down);
keyCode = KeyEvent.KEYCODE_POWER;
if (down == false) {
if (mPowerKeyHandled == false) {
Log.d(TAG, "STR power key down is missing !!!");
return 0;
} else {
Log.d(TAG, "STR dc on mstar.str.suspending = 1");
SystemProperties.set("mstar.str.suspending", "1");
}
}
} else {
Log.d(TAG, "STR dc on forbid keyCode=" + keyCode);
return 0;
}
}
}

我们可以看到在这个方法中有一句SystemProperties.set("mstar.str.suspending", "1");也就是当Power key第一次被按下的时候会执行该动作,将mstar.str.suspending变量的值置为1,然后如果这个过程中用户再次按下任意一个按键的时候就会进入第一个判断语句,然后被return掉不处理,这就是挡key机制

补充一下挡key机制:为了防止待机时乱按key导致问题,会加入一套挡key机制:一旦待机,任何key(包括Power key)都会被挡掉。知道SRT待机回来才会放开,具体实现是这样的:

阅读全文 »

Android原生待机流程frameworks层分析

发表于 2014-05-03 | 分类于 Android

之前做平台项目的时候,关于待机这一块真的是出现了很多问题,因为我们开发智能电视的待机流程和Android原生待机又有一些不同,我们在Android原生的基础上增加了一些我们自己的东西,比如待机前会给出警示等。自己没事的时候也研究过Android原生的待机和我们自己的待机流程,最近又有负责SRT待机这一块的一个同事做过一次技术分享,然后就趁五一放假有时间好好整理一下。

PS:以下分析都是基于Android4.3的

Android原生待机流程

Android原生待机流程如下图所示:

用户在长按Android的电源键的时候会在Android的frameworks层被捕获,具体文件路径是

1
frameworks\base\policy\src\com\android\internal\policy\impl

中的PhoneWindowManager.java进行处理,当按下待机键时会在PhoneWindowManager中的interceptKeyBeforeQueueing方法中将PowerKey拦下,然后进行判断是一次动作还是长按,是长按的话就会触发mPowerLongPress这个线程,我们来看一下这个线程的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private final Runnable mPowerLongPress = new Runnable() {
@Override
public void run() {
// The context isn't read
if (mLongPressOnPowerBehavior &lt; 0) {
mLongPressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior);
}
int resolvedBehavior = mLongPressOnPowerBehavior;
if (FactoryTest.isLongPressOnPowerOffEnabled()) {
resolvedBehavior = LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;
}

switch (resolvedBehavior) {
case LONG_PRESS_POWER_NOTHING:
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:
mPowerKeyHandled = true;
if(!performHapticFeedbackLw(null,HapticFeedbackConstants.LONG_PRESS,false)) {
performAuditoryFeedbackForAccessibilityIfNeed();
}
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
showGlobalActionsDialog();
break;
case LONG_PRESS_POWER_SHUT_OFF:
case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
mPowerKeyHandled = true;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);
break;
}
}
};

阅读全文 »

Android改变view容器中的重叠位置

发表于 2013-11-13 | 分类于 Android

我们都知道Android应用的所有UI组件都继承了View类,View组件非常类似于Swing编程中的JPanel,它代表一个空白的矩形区域,View类还有一个重要的子类:ViewGroup,但ViewGroup通常作为其他组件的容器使用。Android的所有UI组件都是建立在View,ViewGroup基础之上的

对于一个Android应用的图形用户界面来说,ViewGroup作为容器来盛装其他组件,当我们往ViewGroup中调用addView方法添加组件的时候,不重写addView方法的话,默认父控件就会按照添加顺序依次绘制加入的控件,而且默认后加入的子控件会覆盖新加入的子控件,如果我们想自己控制子控件的显示顺序的话,一方面可以自己重写addView方法,另一方便通过查阅ViewGroup源码我们可以看到有一个这样的方法:

1
2
3
4
5
6
7
8
public void bringChildToFront(View child) {
int index = indexOfChild(child);
if (index != 0) {
    removeFromArray(index);
    addInArray(child, mChildrenCount);
    child.mParent = this;
}
}

从名字我们就可以看到这个方法是将指定的子控件带到最前面,从实现方法可以看出,先得到子控件的index,然后将对应index的子控件从控件顺序数组中一处,然后再重新加入到数组,这样一来,该子控件就到数组的结尾了,也就是到最前面了。
最后一步很重要,就是不要忘了要调用postInvalidate()方法来刷新

Java中枚举enum的基本用法

发表于 2013-10-24 | 分类于 Java

因为之前看电视底层的一些接口很多地方都用到了枚举,所以现在学学,总结一下枚举,首先我们先看一下一个例子

1
2
3
public enum Color{
RED,BLUE,BLACK,YELLOW,GREEN
}

事实上枚举enum声明定义的类型就是一个类,所以我们统称为枚举类,这些类都是类库中Enum类的子类(java.lang.Enum)。它们会继承Enum中的方法,通常这些方法能帮助我们更好地操作枚举类。上述Color就是一个枚举类,而且是一个不可被继承的final类。其枚举值(RED,BLUE…)都是Color类型的类静态常量,可以通过下面的方式来得到Color枚举类的一个实例

1
Color c=Color.RED;

注意:这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值一般都是大写,既然枚举类也是类,当然也会有构造器,方法和数据域,但是,枚举类的构造器和普通类的构造器有很大的不同:

##枚举构造器的不同

  • 构造器只是在构造枚举值的时候被调用
  • 构造器只能是私有的private,不允许有public构造器
    这样可以保证外部代码无法新构造枚举类实例,因为我们知道枚举值是public static final的常量而已。但枚举值的方法和数据域允许外部访问。
  • 枚举类可以在switch中使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Color color=Color.RED;
    switch(color){
    case RED:
    System.out.println("it's red");break;
    case BLUE:
    System.out.println("it's blue");break;
    case BLACK:
    System.out.println("it's blue");break;
    }

枚举类常用的方法

ordinal()方法:

返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。

1
2
Color.RED.ordinal();  //返回结果:0
Color.BLUE.ordinal();  //返回结果:1

compareTo()方法:

Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常(具体可见源代码)

1
Color.RED.compareTo(Color.BLUE);  //返回结果 -1

values()方法:

静态方法,返回一个包含全部枚举值的数组。

1
2
3
4
Color[] colors=Color.values();
for(Color c:colors){
System.out.print(c+",");
}//返回结果:RED,BLUE,BLACK YELLOW,GREEN,

toString()方法:

返回枚举常量的名称。

1
2
Color c=Color.RED;
System.out.println(c.toString());//返回结果: RED

valueOf()方法:

这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。

1
Color.valueOf("BLUE");   //返回结果: Color.BLUE

equals()方法:

比较两个枚举类对象的引用。

1…4567
picksomething

picksomething

专注Android,Java,RN,Python

65 日志
17 分类
148 标签
RSS
© 2018 PICKSOMETHING
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4