存档在 2015年8月

onNewIntent()触发机制及注意事项

2015年8月29日

一、onNewIntent()

在IntentActivity中重写下列方法:onCreate onStart onRestart  onResume  onPause onStop onDestroy  onNewIntent
1、其他应用发Intent,执行下列方法:
onCreate
onStart
onResume

发Intent的方法:

<activity android:name=".IntentActivity" android:launchMode="singleTask"
                  android:label="@string/testname">
             <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="philn"/>
            </intent-filter>
</activity>

2、接收Intent声明:

Uri uri = Uri.parse("http://XXXXXXX.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);    
startActivity(it);

 
» 阅读更多: onNewIntent()触发机制及注意事项

FragmentPagerAdapter与FragmentStatePagerAdapter区别

2015年8月27日

在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动。不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希望能够通过调用 mAdapter.notifyDataSetChanged() 来触发 Fragment 页面使用新的数据调整或重新生成其内容,可是当我调用 notifyDataSetChanged() 后,发现什么都没发生。

搜索之后发现不止我一个人碰到这个问题,大家给出的解决办法五花八门,有些确实解决了问题,但是我总感觉问题没搞清楚。于是我决定搞明白这个问题到底是怎么回事,以及正确的用法到底如何。要搞明白这个问题,仅仅阅读文档并不足够,还需要阅读相关几个类的相关方法的实现,搞懂其设计意图。下面就是通过阅读源代码搞明白的内容。

» 阅读更多: FragmentPagerAdapter与FragmentStatePagerAdapter区别

注解框架AndroidAnnotations

2015年8月26日

之前也了解过注解框架及AndroidAnnotations框架,但是没有深入地学习,感觉这个框架确实好用,所以决定认真学习下,在接下来的项目中利用起来! AndroidAnnotations框架的最大优势在于可以用注解的方式大大减少开发的代码量,提高程序的运行效率。

在AndroidAnnotations中有很多针对各种控件,组件等使用的annotations,开发中常用的,可以快速上手的annotations有:
1,Enhanced componets(组件注解):
@EActivity:对Activity的注解操作,我们在写一个Activity时,只要在类名上写上@EActivity(R.layout.xx),就可以把对应的布局关联到此Activity,再也不用在Oncreate(Bundle savedInstanceState)来通过setContentView(R.layout.xx)来关联对应布局,方便吧!
@EService:对Service组件的注解。
@EProvider:对ContentProvider组件的注解。
@EReceiver:对Broadcastreceiver组件进行注解。
还有@EApplication,@EView等。

2,Injections(常用操作注解):
@ViewById:替代我们平时 代码 中的findViewsById();
@ViewsById:同上一样的,只不过可以同时对多个view进行findViewsById()操作。
@AfterViews:用于在我们@ViewById后进行设置数据等操作。
@Extra:用于在组件之间跳转时数据传递操作,我们通常是在Intent中putExtra(),然后再接收页面用getIntent().getString()来获取数据,有了@Extra后,我们就不用getIntent().getString()来取传递的数据了。

3,Event binding(事件绑定注解):
@Click:点击事件注解,替代我们平时的setOnclickListener()方法,只要在方法上加上@Click(R.id.btn),括号里指要进行点击事件的控件id,
@Touch:onTouch()事件注解
@ItemClick,@ItemLongClick,@ItemSelect:对我们学用的ListView,GridView等组件的item点击事件,item长按事件进行的注解 操作。
@TextChange,@AtferTextChange,@BeforTextChange:用与EditText等输入文字变化 监听的注解。
还有@FocusChange等。

4,Threading(线程处理注解)
@Background:后台处理操作
@UiThread:主线程操作等
5,Resource injection(资源文件注解):
@StringRes:对资源文件String.xml关联注解
@ColorrRes:对资源文件color.xml关联注解
还有@DimensionRes,@StringArrayRes等

6,还有其它很多类型的annotations,可以参考官网:https://github.com/excilys/androidannotations/wiki/AvailableAnnotations。
下面是使用注解编写代码的小例子,也是参考官网的:

@EActivity(R.layout.translate) // Sets content view to R.layout.translate
public class TranslateActivity extends Activity {

    @ViewById // Injects R.id.textInput
    EditText textInput;

    @ViewById(R.id.myTextView) // Injects R.id.myTextView
    TextView result;

    @AnimationRes // Injects android.R.anim.fade_in
    Animation fadeIn;

    @Click // When R.id.doTranslate button is clicked 
    void doTranslate() {
         translateInBackground(textInput.getText().toString());
    }

    @Background // Executed in a background thread
    void translateInBackground(String textToTranslate) {
         String translatedText = callGoogleTranslate(textToTranslate);
         showResult(translatedText);
    }

    @UiThread // Executed in the ui thread
    void showResult(String translatedText) {
         result.setText(translatedText);
         result.startAnimation(fadeIn);
    }

    // [...]
}

最后,简单记录下使用AndroidAnnotations的注意事项:
1,比如我们要项目中有个Activity是FristActivity,我们在注册到AndroidManifest.xml中对应的activity是在FristActivity_(在你写的Activity类名后加下划线),否则将报错,
2,我们在跳转页面时,我们写入Intent中跳转目标Acitivity类名也是要写末尾带下划线的对应Activity,
3,我们在使用@ViewById时,如果你在Activity中定义的组件名和xml中的id是一样的,则可以直接写@ViewById,而不用写@ViewById(R.id.xx),
4,一定要@AfterViews对应的方法中进行view的一些设置,不要在oncreate()中设置,因为oncreate()在执行时 view还没有注入,这时运行会报错。
5,推荐一篇注解使用介绍较全面(当然没官网全面啦)的文章:http://www.csdn123.com/html/topnews201408/29/729.htm。

OnScrollListener回调分析

2015年8月25日

如果adapter中的数据量很大的时候,在加载listview时会出现卡顿的现象。这是会让用户抓狂!最好的解决办法就是先加载一定数量的数据,然后在最下方提示正在加载!
动态加载就是把放入adapter中的数据分好几次加载。在用户拖动listview时再加载一定的数据,和sina微博的客户端类似。
给listview添加OnScrollListener监听事件默认会覆盖下面两个方法:

new OnScrollListener() {    
        boolean isLastRow = false;    
        
        @Override    
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {    
            //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。    
            //firstVisibleItem:当前能看见的第一个列表项ID(从0开始)    
            //visibleItemCount:当前能看见的列表项个数(小半个也算)    
            //totalItemCount:列表项共数    
        
            //判断是否滚到最后一行    
            if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {    
                isLastRow = true;    
            }    
        }    
        @Override    
        public void onScrollStateChanged(AbsListView view, int scrollState) {    
            //正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调    
            //回调顺序如下    
            //第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动    
            //第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)    
            //第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动                          //当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1;  
            //由于用户的操作,屏幕产生惯性滑动时为2  
        
            //当滚到最后一行且停止滚动时,执行加载    
            if (isLastRow && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {    
                //加载元素    
                ......    
        
                isLastRow = false;    
            }    
        }    
    }

Json文本格式化

2015年8月25日

以前分享过一条对象Json化后格式化文本:点击这里

但是对于一段已经是文本的Json字符串,可以使用如下的代码进行格式化

package net.unix8;

public class JsonFormatTool  
{  
    /** 
     * 单位缩进字符串。 
     */  
    private static String SPACE = "   ";  
      
    /** 
     * 返回格式化JSON字符串。 
     *  
     * @param json 未格式化的JSON字符串。 
     * @return 格式化的JSON字符串。 
     */  
    public String formatJson(String json)  
    {  
        StringBuffer result = new StringBuffer();  
          
        int length = json.length();  
        int number = 0;  
        char key = 0;  
          
        //遍历输入字符串。  
        for (int i = 0; i < length; i++)  
        {  
            //1、获取当前字符。  
            key = json.charAt(i);  
              
            //2、如果当前字符是前方括号、前花括号做如下处理:  
            if((key == '[') || (key == '{') )  
            {  
                //(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。  
                if((i - 1 > 0) && (json.charAt(i - 1) == ':'))  
                {  
                    result.append('\n');  
                    result.append(indent(number));  
                }  
                  
                //(2)打印:当前字符。  
                result.append(key);  
                  
                //(3)前方括号、前花括号,的后面必须换行。打印:换行。  
                result.append('\n');  
                  
                //(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。  
                number++;  
                result.append(indent(number));  
                  
                //(5)进行下一次循环。  
                continue;  
            }  
              
            //3、如果当前字符是后方括号、后花括号做如下处理:  
            if((key == ']') || (key == '}') )  
            {  
                //(1)后方括号、后花括号,的前面必须换行。打印:换行。  
                result.append('\n');  
                  
                //(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。  
                number--;  
                result.append(indent(number));  
                  
                //(3)打印:当前字符。  
                result.append(key);  
                  
                //(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。  
                if(((i + 1) < length) && (json.charAt(i + 1) != ','))  
                {  
                    result.append('\n');  
                }  
                  
                //(5)继续下一次循环。  
                continue;  
            }  
              
            //4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。  
            if((key == ','))  
            {  
                result.append(key);  
                result.append('\n');  
                result.append(indent(number));  
                continue;  
            }  
              
            //5、打印:当前字符。  
            result.append(key);  
        }  
          
        return result.toString();  
    }  
      
    /** 
     * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。 
     *  
     * @param number 缩进次数。 
     * @return 指定缩进次数的字符串。 
     */  
    private String indent(int number)  
    {  
        StringBuffer result = new StringBuffer();  
        for(int i = 0; i < number; i++)  
        {  
            result.append(SPACE);  
        }  
        return result.toString();  
    }  
}  

view的setTag() 和 getTag()应用

2015年8月25日

View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。

可以用在多个Button添加一个监听器,每个Button都设置不同的setTag。这个监听器就通过getTag来分辨是哪个Button 被按下。

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
public class Main extends Activity {
 
@Override
public void onCreate(Bundle savedInstanceState){ 
 
 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
 
 
    Button button1 = (Button) findViewById(R.id.Button01); 
    Button button2 = (Button) findViewById(R.id.Button02); 
    Button button3 = (Button) findViewById(R.id.Button03); 
    Button button4 = (Button) findViewById(R.id.Button04); 
 
 
    MyListener listener = new MyListener(); 
    button1.setTag(1); 
    button1.setOnClickListener(listener); 
 
 
    button2.setTag(2); 
    button2.setOnClickListener(listener); 
 
 
    button3.setTag(3); 
    button3.setOnClickListener(listener); 
 
 
    button4.setTag(4); 
    button4.setOnClickListener(listener); 
}
 
public class MyListener implements View.OnClickListener {
 
    @Override
    public void onClick(View v) {
        int tag = (Integer) v.getTag();
        switch (tag){ 
        case 1: 
           System.out.println("button1 click"); 
        break; 
 
 
        case 2: 
           System.out.println("button2 click"); 
        break; 
 
 
        case 3: 
           System.out.println("button3 click"); 
        break; 
 
 
        case 4: 
        System.out.println("button4 click");
        break; 
     }
   }
 }
}

在写listView 时候要重写BaseAdapter
需要在每个item都加上button 点击button做相应操作
这个时候需要button里面设置下 这行的属性button.setTag(item.user.name);
然后处理button事件。
这个东西在一些需要用到Adapter自定控件显示方式的时候非常有用
Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用

public View getView(int position, View convertView, ViewGroup parent) {
 
    ViewHolder vh;
    if (convertView == null){ 
        LayoutInflater inflater = (LayoutInflater) mWidgetsSwitchApp .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        convertView = inflater.inflate(R.layout.app_gallery_item, null); 
        vh = new ViewHolder(); 
        vh.view1 = (ImageView) convertView.findViewById(R.id.view1); 
        vh.view2 = (ImageView) convertView.findViewById(R.id.view2); 
        vh.view3= (ImageView) convertView.findViewById(R.id.view3); 
        vh.view4 = (ImageView) convertView.findViewById(R.id.view4); 
        convertView.setTag(vh); 
    }else{ 
       vh = (ViewHolder) convertView.getTag(); 
    }
    //其他的代码可以直接使用 vh.view1、vh.view2、vh.view3 、vh.view4
}

你可以看看android的源码,特别有listview的,你就会发现这个函数很多时候有妙用!呵呵!
我的一点理解是,绑定数据,特别是绑定数据到view。而且可以用getTag()取得,很方便,而且是任意类型的数据,真的很酷。
在实例BaseAdapter()的getView(position, convertView, par)里有用到。convertView这里会用到setTag() getTag()。就可以生成convertView并复用里面的widget
一直觉得这个东西没啥用setTag(),不过只要能用上 就是比较巧的了
在一个程序中呢 我有好多个button 我想点击一个出现1 点击第二个出现2

for (int i = 0; i < 20; i++) {
     cells[i] = (ImageView) findViewById(cellIDs[i]);
     cells[cellnumber++].setOnClickListener(new OnClickListener() {
 
          public void onClick(View v){ 
              cellClicked(cellnumber, v); 
          }
      });
}

上面的代码效率不高 而且 无论点击哪一个都会出现21 当然这是我逻辑错误那怎么实现呢

OnClickListener listener = new OnClickListener() {
 
     public void onClick(View v){ 
        int cellId = (Integer) v.getTag(); cellClicked(cellId, v); 
     }
}
View v;
for (int i = 0; i < 20; i++){ 
    v = findViewById(cellIDs[i]); 
    v.setOnClickListener(listener); 
    v.setTag(i); 
}

这样呢就实例话一个listener,同时通过tag传值就不是每一个实例都做了

MySQL Binlog的介绍

2015年8月18日

binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;

作用:MySQL的作用类似于Oracle的归档日志,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)

二进制日志的信息:

文件位置:默认存放位置为数据库文件所在目录下

文件的命名方式: 名称为hostname-bin.xxxxx (重启mysql一次将会自动生成一个新的binlog)

状态的查看:mysql> show variables like ‘%log_bin%’;

mysql> show variables like ‘%log_bin%’;

+———————————+——-+

| Variable_name | Value |

+———————————+——-+

| log_bin | ON | //表示当前已开启二进制日志//

| log_bin_trust_function_creators | OFF |

| sql_log_bin | ON |

+———————————+——-+

3 rows in set (0.00 sec)

 

二进制日志的管理:

1、开启二进制日志配置

方法一、修改my.cnf参数文件,该方法需要重启

 

log-bin = mysql-bin #打开日志(主机需要打开),这个mysql-bin也可以自定义,这里也可以加上路径,如:/home/www/mysql_bin_log/mysql-bin

关闭二进制日志的方法:log-bin = mysql-bin注释掉即可
 

方法二、不重启修改二进制日志配置,该方法mysql的版本需要5.6以上

SET @@global.log_bin=1|0  (1为开启,0为关闭)

SET @@global.binlog_size=37268(单位bytes)

 

3、暂停二进制日志

SET sql_log_bin={0|1}

 

4、修改二进制日志的大小

修改my.cnf参数文件中的max_binlog_size的值;

说明:如果你的二进制文件的大小超过了max_binlog_size,它就是自动创建新的二进制文件。当然如果恰好在日志文件到达它的最大尺寸时写入了大的事务,那么日志文件还是会超过max_binlog_size的大小

 

5、进行二进制日志的切换,默认情况下当二进制日志写满了或者数据库重启了才会进行切换,但是也可以手工的进行切换的动作

mysql> flush logs;

 

6、其他参数:

binlog-cache-size=100m 设置二进制日志缓存大小

sync-binlog=N(每个N秒将缓存中的二进制日志记录写回硬盘,默认值为0。不过,你经常会陷入group commit函数与I/O之间二选一的矛盾。如果在replication环境中,由于考虑到耐久性与一致性,则需要设置1。同时,还需要设置innodb_flush_log_at_trx_commit=1以及innodb-support-xa=1默认开启;)

二进制日志的写入过程

查看二进制日志的内容:

binlog不能直接用文本的方式打开,mysql提供了相应的查看工具:mysqlbinlog,直接查看单个二进制日志文件:mysqlbinlog    filename

例如: mysqlbinlog /data/mysql/mysql-bin.000001

当然也可以通过二进制日志完成数据库的恢复,具体的使用将在数据库的备份还原中介绍。

删除二进制日志

二进制日志会不断的增长,并产生多个文件。因此,需要制定备份计划和管理策略.无用的二进制日志要记得及时删除。

删除慢查询日志有三种方法:

1、操作系统命令直接删除

2、reset master

3、PURGE BINARY LOGS BEFORE ‘2014-07-09 12:40:26′;

总结:二进制日志用途广泛也很重要,大多少情况下会开启,对于业务操作频繁的数据库需要制定相应的备份策略和删除策略;

MySQL数据恢复--binlog  http://www.linuxidc.com/Linux/2014-03/97907.htm

MySQL中binlog日记清理 http://www.linuxidc.com/Linux/2011-02/32017.htm

如何安全删除MySQL下的binlog日志 http://www.linuxidc.com/Linux/2013-06/86527.htm

MySQL–binlog日志恢复数据 http://www.linuxidc.com/Linux/2013-04/82368.htm

MySQL删除binlog日志及日志恢复数据的方法 http://www.linuxidc.com/Linux/2012-12/77072.htm

MySQL binlog三种格式介绍及分析 http://www.linuxidc.com/Linux/2012-11/74359.htm

MySQL 利用binlog增量备份+还原实例 http://www.linuxidc.com/Linux/2012-09/70815.htm

MySQL删除binlog日志及日志恢复数据 http://www.linuxidc.com/Linux/2012-08/67594.htm

一些题目

2015年8月17日

1. 云计算
1) 延迟保证虚拟机实时迁移研究
2) 相似感知划分为高效的云存储研究
3) 云计算系统数据延迟最小化虚拟机放置最佳逼近算法
4) 隐私感知云辅助医疗监控系统
5) 分布式云计算服务器配置
6) 基于云计算的综合交通路况预测
7) 可靠的虚拟数据中心中嵌入云
8) 合作与修复最小化分布式存储云
9) 基于位置的移动网络设备隐私保护
10) 云计算搜索隐私保护
11) 动态内容分配的周期性工作负载的云计算辅助服务
12) 虚拟机的功耗与网络传输:监控与改进
13) 个人云:共享和整合网络资源

2. 大数据
1) 实现高效的访问控制与动态策略更新的大数据在云
2) 上传可延迟大数据到云在线算法
3) 指纹识别大数据工作负载的周期性
4) 数据中心流量感知虚拟机配置算法
5) 分布式数据存储系统修复算法
6) 大规模移动流量数据集分类
7) 大信息来源估计稀疏观察
8) 数据中心网络的联合功率优化和服务器与相关性分析

3. 无线定位
1) 3D地形表面定位
2) 4D定位(加入时间)
3) O2O定位与消息推送
4) 水下交通工具定位
5) 水面交通工具定位
6) 电子蛙眼WiFi计数
7) 智能手机声定位和细粒度室内定位
8) 地化无线充电感应器与充电时间优化算法
9) 用户室内导航系统

4. RFID / 无线射频
1) 大型RFID的供应链效率的分布式查询处理
2) 直方图RFID标签网络高效信息收集与查询
3) 被动式标签的设备目标跟踪算法
4) 大规模的RFID基数估算
5) RFID批量数据读取

5. 安全与隐私
1) 智能电表隐私保护
2) 区域移动社交网络隐私保护框架
3) 匿名的隐私感知基于位置的服务
4) 马尔可夫链指纹进行分类加密流量
5) 无线传感器网络攻击和对策压缩数据收集
6) 移动僵尸网络的演变与影响
7) 移动网络欺诈分析与检测
8) 分布式异常检测网络数据流
9) 移动恶意流量监控
10) 移动网络灾害影响评估
11) 容错覆盖的无线传感器网络
12) 异构感知数据再生分布式存储系统
13) 大型分布式系统的分层因果图性能诊断

6. 无线/移动网络
1) 无线网络覆盖范围的最优算法
2) 3D无线网络覆盖最优算法
3) 4D无线网络覆盖最优算法
4) “无线网络没有边缘”:动态无线资源集群和用户调度
5) 移动社交网络的信息扩散速度研究
6) 移动设备离线访问社交网络内容
7) 延迟容限的智能手机应用程序的动态速度换算为能量最小化
8) 蓝牙设备识别系统

7. 传感器网络

1) 保证覆盖无线传感器网络建筑(人体)结构健康监测
2) 城市环境感应驾驶条件来车速估算
3) 位置相关的任务优化配置算法
4) 基于无线传感器网络感应水下航行设备
5) 移动视频监控同构无线传感器网络犯罪感知
6) 移动网络空间事件检测
7) 基于传感器网络关键型机器人移动能源补给的任务
8) 连接无线摄像头网络部署与可视范围
9) 交通监控压缩感知应用
10) 改进结构的数据采集无线传感器网络
11) 无线传感器网络近似计数的
12) 覆盖在视觉传感器网络与云台变焦摄像机
13) 视觉辅助电子道路探测系统
14) 无线传感器网络异构数据轨迹规划

8. 网络监控与测量
1) 日志数据对于了解网络事件时空分解
2) 位置共享服务数据挖掘
3) 用户浏览活动树恶意HTTP重定向检测
4) 互联网速率的限制纵向分析
5) 监视器位置的最大可辨识的网络断层扫描
6) 移动视频测度研究

9. 车载网络
1) 车载网络动态移动广告分发策略
2) 大都市公共交通感知(出租车+公交车)
3) 协同高级驾驶员辅助系统,以减轻车辆交通冲击波
4) 数据驱动车载交通流分析