Android -- 經驗分享

目錄                                                                                             java

  • 代碼中安裝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                                                                              android

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

須要在manifest.xml文件中,加上INSTALL_PACKAGES的權限,能夠用 Package install的receiver來處理安裝成功後的操做安全

或者:app

/** 
     * 安裝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是否已經安裝                                                              ide

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
    }

取得屏幕大小                                                                                 函數

一、在非activity類中post

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

二、在activity類中ui

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

得到 LayoutInflater 實例的三種方式                                              this

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

示意代碼:url

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

相關文章
相關標籤/搜索