目錄 java
代碼中安裝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主要用來處理接受到的消息。
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發送一次消息。
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);
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