Android -- 经验分享

目录                                                                                            

  • 代码中安装apk
  • 判断某个apk是否已经安装
  • 取得屏幕大小
  • 获得 LayoutInflater 实例的三种方式
  • ContentResolver.query(),以及 Activity.managedQuery异同
  • 解锁功能
  • 点亮屏幕
  • activity全屏显示
  • 屏常亮代码
  • SQL中 inner join、 left join 、right join、 outer join之间的区别
  • 包含button的item也能弹出菜单,回调click以及long click的监听器
  • 背光亮度   /sys/class/leds/lcd-backlight/brightness
  • 判断是否在锁屏界面的函数
  • OnTouchListener实现双击事件
  • 回到待机界面
  • 定时器相关
  • sd卡和sim卡状态判断
  • 开机启动,检查sim卡是否发生变更

代码中安装apk                                                                             

Runtime.getRuntime().exec("pm install xxx.apk");

需要在manifest.xml文件中,加上INSTALL_PACKAGES的权限,可以用 Package install的receiver来处理安装成功后的操作

或者:

/**
     * 安装apk
     * @param url
     */
    private void installApk(String saveFileName){
        File apkfile = new File(saveFileName);
        if (!apkfile.exists()) {
            return;
        }
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
        mContext.startActivity(i);
}

判断某个APK是否已经安装                                                             

private boolean isAppInstalled(String uri){  

    PackageManager pm = getPackageManager();
    boolean installed =false;
    try{
        pm.getPackageInfo(uri,PackageManager.GET_ACTIVITIES);
        installed =true;
    }catch(PackageManager.NameNotFoundException e){
        installed =false;
    }  

    return installed;
 }
//Just call the method by passing the package name of the application you need to check.
    if(isAppInstalled("com.yourpackage.package")){
     //app installed
    }else{
      //app not installed
    }

取得屏幕大小                                                                                

1、在非activity类中

WindowManager windowManager = (WindowManager)(mContext.getSystemService(Context.WINDOW_SERVICE));
 int screenWidth = windowManager.getDefaultDisplay().getWidth();
 int screenHeight = windowManager.getDefaultDisplay().getHeight();

2、在activity类中

int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800px)

获得 LayoutInflater 实例的三种方式                                             

LayoutInflater inflater = getLayoutInflater();  //调用Activity的getLayoutInflater()
LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater inflater = LayoutInflater.from(context);

示意代码:

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));

对于上面代码,指定了第二个参数 ViewGroup root,当然你也可以设置为 null 值。

ContentResolver.query(),以及 Activity.managedQuery异同

参数、返回值相同:都返回 Cursor 对象

参数:

URI:  Content Provider 需要返回的资源索引
Projection: 用于标识有哪些columns需要包含在返回数据中。
Selection: 作为查询符合条件的过滤参数,类似于SQL语句中Where之后的条件判断。
SelectionArgs: 同上。
SortOrder: 用于对返回信息进行排序。

不同:

mContext.getContentResolver().query

ContentResolver.query(),以及 Activity.managedQuery()所以,我们看到一个是ContentResolver提供的查询方法,位于android.content.ContextWrapper.getContentResolver(),另一个则为Activity。

Activity.managedQuery()  方法导致活动管理 Cursor 的生命周期

解锁功能                                                                                      

KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("");
keyguardLock.disableKeyguard();
PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);

点亮屏幕                                                                                      

PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_DIM_WAKE_LOCK,"SimpleTimer");
mWakeLock.acquire();//点亮
mWakeLock.release();//关闭

activity全屏显示                                                                          

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);

注意;要在setContentView(R.layout.layout)语句之前调用才行。

屏常亮代码                                                                                   

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//屏常亮

SQL中 inner join、 left join 、right join、 outer join之间的区别

举例说明

A表(a1,b1,c1)      B表(a2,b2)
a1   b1   c1        a2    b2
01   数学 95         01    张三
02   语文 90         02    李四
03   英语 80         04    王五
select A.*,B.* from A  inner join B on(A.a1=B.a2)
结果是:
a1   b1   c1       a2    b2
01   数学 95       01    张三
02   语文 90       02    李四
select A.*,B.* from A  left outer join B on(A.a1=B.a2)
结果是:
a1   b1   c1       a2    b2
01   数学 95       01    张三
02   语文 90       02    李四
03   英语 80       NULL  NULL
select A.*,B.* from A  right outer join B on(A.a1=B.a2)
结果是:
a1   b1   c1       a2    b2
01   数学 95       01    张三
02   语文 90       02    李四
NULL NULL NULL     04    王五
select A.*,B.* from A  full outer join B on(A.a1=B.a2)
结果是:
a1   b1   c1       a2    b2
01   数学 95       01    张三
02   语文 90       02    李四
03   英语 80       NULL  NULL
NULL NULL NULL     04    王五

包含button的item也能弹出菜单,回调click以及long click的监听器  

设置button属性:

android:focusable="false"

外还要设置 listview属性:

android:longClickable="true"

PS: 如果包含的Button是ImageButton,那么在xml中设置了android:focusable="false"属性在当前版本是无效的,必须在代码中,再次呼叫函数ImageButton.setFocusable(false)设置一次。

或者在父Item里面加上

android:descendantFocusability="blocksDescendants"

背光亮度   /sys/class/leds/lcd-backlight/brightness            

例如

echo 255 > /sys/class/leds/lcd-backlight/brightness

代码修改亮度:

Settings.System.putInt(getContentResolver(), SCREEN_BRIGHTNESS, brightness);    //brightness 背光亮度 0~255
Settings.System.putInt(getContentResolver(),SCREEN_OFF_TIMEOUT, timeoutValues);//timeoutValues 灭屏时间 ms

判断是否在锁屏界面的函数                                                              

KeyguardManager: inKeyguardRestrictedInputMode();

例:

KeyguardManager km = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
boolean keyguardexist = km.inKeyguardRestrictedInputMode();

OnTouchListener实现双击事件                                                    

class MyOnTouchListener implements View.OnTouchListener{
    private long mLastTime = 0;
    private long mCurTime = 0;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(MotionEvent.ACTION_DOWN == event.getAction()){
            mLastTime = mCurTime;
            mCurTime = System.currentTimeMillis();
            if (mCurTime - mLastTime < 1000) {
                // 双击事件  关闭activity
                FullBlackActivity.this.finish();
                return true;
            }
        }
        return false;
    }
}

回到待机界面                                                                                

Intent home = new Intent(Intent.ACTION_MAIN);
home.addCategory(Intent.CATEGORY_HOME);
this.startActivity(home);

定时器相关                                                                                   

  • 采用Handler与线程的sleep(long)方法

Handler主要用来处理接受到的消息。

1. 定义一个Handler类,用于处理接受到的Message。

Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        // 要做的事情
        super.handleMessage(msg);
    }
};

新建一个实现Runnable接口的线程类,如下:

public class MyThread implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            try {
                Thread.sleep(10000);// 线程暂停10秒,单位毫秒
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);// 发送消息
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

3. 在需要启动线程的地方加入下面语句:

new Thread(new MyThread()).start();

4. 启动线程后,线程每10s发送一次消息。

  • 采用Handler的postDelayed(Runnable, long)方法

1. 定义一个Handler类

Handler handler=new Handler();
Runnable runnable=new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        //要做的事情
        handler.postDelayed(this, 2000);
    }
};

2. 启动计时器

handler.postDelayed(runnable, 2000);//每两秒执行一次runnable.

3. 停止计时器

handler.removeCallbacks(runnable);
  • 采用Handler与timer及TimerTask结合的方法

1. 定义定时器、定时器任务及Handler句柄

private final Timer timer = new Timer();
private TimerTask task;
Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        // 要做的事情
        super.handleMessage(msg);
    }
};

2. 初始化计时器任务

task = new TimerTask() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Message message = new Message();
        message.what = 1;
        handler.sendMessage(message);
    }
};

3. 启动定时器

timer.schedule(task, 2000, 2000);

简要说一下上面三步提到的一些内容:

1. 定时器任务(TimerTask)顾名思义,就是说当定时器到达指定的时间时要做的工作,这里是想Handler发送一个消息,由Handler类进行处理。

2. java.util.Timer.schedule(TimerTask task, long delay, long period):这个方法是说,delay/1000秒后执行task,然后进过period/1000秒再次执行task,这个用于循环任务,执行无数次,当然,你可以用timer.cancel();取消计时器的执行。

  • 闹钟定时
AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(SEND_SMS_BEGIN), 0);
am.set(AlarmManager.RTC_WAKEUP, 60*1000, pendingIntent);

耳机状态                                                                                      

private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";    //保存状态文件位置

private boolean isHeadsetExists(){       //判断耳机是否插入的函数    FM源码 FMplayService.java
        char[] buffer = new char[1024];
        int newState = 0;
        try {
            FileReader file = new FileReader(HEADSET_STATE_PATH);
            int len = file.read(buffer, 0, 1024);
            newState = Integer.valueOf((new String(buffer, 0, len)).trim());
        } catch (FileNotFoundException e) {
            Log.e(LOGTAG, "This kernel does not have wired headset support");
        } catch (Exception e) {
            Log.e(LOGTAG, "" , e);
        }
        return newState != 0;
   }
未插入耳机:

# cat /sys/class/switch/h2w/state
cat /sys/class/switch/h2w/state
0

插入耳机:
# cat /sys/class/switch/h2w/state
cat /sys/class/switch/h2w/state
1

sd卡和sim卡状态判断                                                                   

//sdcard是否可读写
public boolean IsCanUseSdCard() {
    try {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
} 

//sim卡是否可读
public boolean isCanUseSim() {
    try {
        TelephonyManager mgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
         return TelephonyManager.SIM_STATE_READY == mgr.getSimState();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

开机启动,检查sim卡是否发生变更                                                  

(1)注册receiver,设置意图过滤器

<receiver android:name=".receiver.BootCompleteReceiver" >
    <intent-filter android:priority="1000" >
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

(2)接受开机广播,并判断sim卡时候发生更改

public class BootCompleteReceiver extends BroadcastReceiver {
    private static final String TAG = "BootCompleteReceiver";
    private SharedPreferences sp;
    private TelephonyManager tm;
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG,"手机重启了");
        sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
        boolean protecting = sp.getBoolean("protecting", false);
        //如果防盗保护开启
        if(protecting){
                //判断sim卡是否发生了变化
        tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            String currentSim = tm.getSimSerialNumber();
            String savedSim= sp.getString("sim", "");
            if(savedSim.equals(currentSim)){
                    // sim卡为发生变化, do nothint
            }else{
                //sim卡发生了变化
                //发送报警短信 给安全号码
                SmsManager smsManager = SmsManager.getDefault();
                String destinationAddretss = sp.getString("safenumber", "");
                smsManager.sendTextMessage(destinationAddretss, null, "sim change !!!", null, null);
            }
        }
    }
}

我是天王盖地虎的分割线                                                                 

参考:http://blog.csdn.net/jimbo_lee/article/details/8694265

Android -- 经验分享

时间: 2024-10-07 04:01:54

Android -- 经验分享的相关文章

Android -- 经验分享(二)

目录                                                                                   自定义两个View进行画图,让其各自刷新重绘 Activity设为singleTop,长按Home键启动的问题 Activity设为singleTop,长按Home键启动问题 Android软键盘挡住界面 Android使用AsyncTask下载图片,最好使用WeakReference Android webview 加载网络视

Android -- 经验分享(三)

目录

Android -- 资源使用和总结经验分享

颜色资源                                                                                       颜色XML文件格式 <?xml version="1.0" encoding="utf-8"?> <resources> //resources根元素 <color name="" >#000000</color> //

Android学习经验分享

最近一直在学习安卓,一直以来都是通过自学和博客园的一些文章来进行学习.这里写下点个人学习安卓的感想与感悟. 一  为什么学习安卓 首相,个人比较喜欢手机上的各种App,觉得像我这样的人手机app粉丝也不再是少数.而在ios和Android分割的天下,显然Android所占的群众比是远多于ios的. 其次,本人临近毕业,将来想寻求一份关于移动开发的工作,而java方向的Android正和和本人的意愿相合. 最后一点,也是很客观的一点.虽然ios的开发者的薪金要高于Android,但是Android

跟Android初学者分享几点经验

刚学Android开发的人肯定想知道过来人是怎样入门的,有哪些经验,怎样能少走弯路.本文就跟大家分享一位Android开发者的入门经验,写的条理很清晰,真正讲出了自己的学习过程,尽管每个人的学习方法和习惯等不同,但也可以从中学到东西. 下面就是他的学习方法分享: 一.看Android开发视频:我刚开始接触android的时候,主要是跟着网上Android开发视频入的门,自己跟着一点一点的敲代码,就这样算是简单的入门,现在在电驴上面有很多的视频资源,记得很多前辈说过类似的话:学技术,有Google

Android内存优化解决 资料和总结的经验分享

在前公司做一个图片处理的应用时, 项目交付的时候,客户的手机在运行应用的时候,一直在崩溃,而这个异常就是OutOfMemory的错误,简称为OOM, 搞得我们也是极其的崩溃,最后 ,我们是通过网上搜集资料和代码走查的方式来优化解决的,这里,我就把我们收集到资料和总结的经验分享下吧. Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.我们平常看到的OutOfMemory的错误,通常 是堆内存溢出.移动开发和web开发的最大的区别是设备资源受限,对一般手

关于Android在线支付Alipay(支付宝)开发的经验分享

在近期,公司需要开发一个关于在线支付的模块,所以需要用到第三方支付平台 转载请注明出处:http://blog.csdn.net/ht_android/article/details/45307165 经过一周多的时间对这两种支付平台的研究,完成功能后将经验分享给大家,希望能帮助到有需求的朋友. 首先是支付宝的开发资料方面: 接口申请url https://b.alipay.com/order/productDetail.htm?productId=2014110308141993 API开发文

公司实习经验分享

近期在一家创业公司做技术 .由于是从一開始跟着做技术,所以到如今给了个技术总监的title. 公司的全部程序都是由我一个人来维护的.公司是做电商创业. pc端从前端html到css 到js到smarty模板 到php到数据库都是一手调较. wap端从为了參加百度推广的一千元优惠活动进行了优化才在最后几分钟成功评上三颗星. app端android也是我一手改动.近期可能ios端也要我来做了.. 经验分享: 原来认为创业真是简单. 尤其是技术型创业.可是经历过这次就不一样了.原来做站点是要申请icp

微信登陆,微信SDK授权登陆经验分享

From:http://www.eoeandroid.com/thread-547012-1-1.html 最近因为项目需要做了微信登陆,好像也是微信最近才放出来的接口.还需要申请才能有权限实现授权.其实也比较简单,跟新浪微博和qq授权登陆差不多.不过还是有点差别,不知道是微信sdk本身就没有完善还是其他问题.会有一点蛋疼的地方,下面会细说.(由于等级不够,不能发在经验分享区,只能先写在这里了.希望对要做微信登陆的朋友有帮助,如果有不对的地方还希望大家直言不讳)<ignore_js_op> 首