文件1
MainActivity.java:
import android . app . Activity ;import android . content . Context ;import android . content . res . Resources ;import android . os . Bundle ;import android . os . Handler ;import android . os . Message ;import android . os . PowerManager ;import android . os . SystemClock ;import android . util . Log ;import android . view . View ;import android . view . View . OnClickListener ;import android . widget . Button ;import android . widget . TextView ;public class MainActivity extends Activity implements OnClickListener {/** Called when the activity is first created. */final static int kStateKey = R . id . StateKey ;final static int kTextTurnOnKey = R . id . TextTurnOnKey ;final static int kTextTurnOffKey = R . id . TextTurnOffKey ;final static String kStateOff = "off" ;final static String kStateOn = "on" ;PowerManager pm ;PowerManager . WakeLock wl ;final static String tag = "robin" ;Handler handler = new MyHandler ();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button btn=null;Resources res=this.getResources();for(int i=R.id.Button0;i<=R.id.Button5;i++){btn=(Button)findViewById(i);btn.setTag(kStateKey, kStateOff);if(i==R.id.Button0){btn.setTag(kTextTurnOnKey,res.getString(R.string.acquire_PARTIAL));btn.setTag(kTextTurnOffKey,res.getString(R.string.release_PARTIAL));}else if(i==R.id.Button1){btn.setTag(kTextTurnOnKey,res.getString(R.string.acquire_SCREEN_DIM));btn.setTag(kTextTurnOffKey,res.getString(R.string.release_SCREEN_DIM));}else if(i==R.id.Button2){btn.setTag(kTextTurnOnKey,res.getString(R.string.acquire_SCREEN_BRIGHT));btn.setTag(kTextTurnOffKey,res.getString(R.string.release_SCREEN_BRIGHT));}else if(i==R.id.Button3){btn.setTag(kTextTurnOnKey,res.getString(R.string.acquire_FULL_WAKE_LOCK));btn.setTag(kTextTurnOffKey,res.getString(R.string.release_FULL_WAKE_LOCK));}else if(i==R.id.Button4){btn.setTag(kTextTurnOnKey,res.getString(R.string.combineFlag0));btn.setTag(kTextTurnOffKey,res.getString(R.string.notCombineFlag0));}else if(i==R.id.Button5){btn.setTag(kTextTurnOnKey,res.getString(R.string.combineFlag1));btn.setTag(kTextTurnOffKey,res.getString(R.string.notCombineFlag1));}btn.setText((String)btn.getTag(kTextTurnOnKey));btn.setOnClickListener(this);}OnClickListener listener=new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif(v.getId()==R.id.Button6){pm.goToSleep(SystemClock.uptimeMillis());}else if (v.getId()==R.id.Button7){pm.reboot("robin test the reboot api");}else if(v.getId()==R.id.Button8){Message msgSend=handler.obtainMessage(kCmdUserActivity, 10, 0);handler.sendMessageDelayed(msgSend, 35*1000);}}};btn=(Button)findViewById(R.id.Button6);btn.setOnClickListener(listener);btn=(Button)findViewById(R.id.Button7);btn.setOnClickListener(listener);btn=(Button)findViewById(R.id.Button8);btn.setOnClickListener(listener);pm = (PowerManager) getSystemService(Context.POWER_SERVICE);}int mFlag=0;long time=0;public void onClick(View v) {time=System.currentTimeMillis();// TODO Auto-generated method stubTextView tv=(TextView)v;int id=tv.getId();if(id==R.id.Button4){if(v.getTag(kStateKey).equals(kStateOff)){mFlag|=PowerManager.ACQUIRE_CAUSES_WAKEUP;}else{mFlag=mFlag&~PowerManager.ACQUIRE_CAUSES_WAKEUP;}}else if(id==R.id.Button5){if(v.getTag(kStateKey).equals(kStateOff)){mFlag|=PowerManager.ON_AFTER_RELEASE;}else{mFlag=mFlag&~PowerManager.ON_AFTER_RELEASE;}}else{if(v.getTag(kStateKey).equals(kStateOff)){unReleaseOtherLock(id);int flag=0;if(id==R.id.Button0){flag=PowerManager.PARTIAL_WAKE_LOCK;}else if (id==R.id.Button1){flag=PowerManager.SCREEN_DIM_WAKE_LOCK;}else if(id==R.id.Button2){flag=PowerManager.SCREEN_BRIGHT_WAKE_LOCK;}else if(id==R.id.Button3){flag=PowerManager.FULL_WAKE_LOCK;}if(id!=R.id.Button0){flag=flag|mFlag;}if(mFlag==0||id==R.id.Button0){wl = pm.newWakeLock(flag,tag);wl.acquire();}else{int delayMillis=1;if((mFlag&PowerManager.ACQUIRE_CAUSES_WAKEUP)!=0)delayMillis=50*1000;Message msg=handler.obtainMessage(kCmdAcquireLock, flag, 0);handler.sendMessageDelayed(msg, delayMillis);if((mFlag&PowerManager.ON_AFTER_RELEASE)!=0){msg=handler.obtainMessage(kCmdReleaseLock, flag, 0);delayMillis=delayMillis+20*1000;handler.sendMessageDelayed(msg, delayMillis);}}}else if(wl!=null){wl.release();wl=null;}}if(v.getTag(kStateKey).equals(kStateOff)){tv.setTag(kStateKey, kStateOn);tv.setText((String)tv.getTag(kTextTurnOffKey));Log.i(tag, "set to turn off in onclick");}else{tv.setTag(kStateKey, kStateOff);tv.setText((String)tv.getTag(kTextTurnOnKey));Log.i(tag, "set to turn on in onclick");}}void unReleaseOtherLock(int id){handler.removeMessages(kCmdAcquireLock);handler.removeMessages(kCmdReleaseLock);if(wl!=null){wl.release();wl=null;}Button btn=null;for(int i=R.id.Button0;i<=R.id.Button3;i++){if(id==i)continue;btn=(Button)findViewById(i);btn.setTag(kStateKey, kStateOff);btn.setText((String)btn.getTag(kTextTurnOnKey));Log.i(tag, "set to"+btn.getText());}}public void onResume(){time=System.currentTimeMillis();Log.i(tag,"OnResume");super.onResume();}public void onPause(){long t=(System.currentTimeMillis()-time)/1000;Log.i(tag,"pause after user activity time:"+t);super.onPause();}public void onDestroy(){if(wl!=null){wl.release();wl=null;}super.onDestroy();}final static int kCmdAcquireLock=0;final static int kCmdReleaseLock=1;final static int kCmdUserActivity=2;class MyHandler extends Handler{public void handleMessage (Message msg){switch(msg.what){case kCmdAcquireLock:int flag=msg.arg1;wl = pm.newWakeLock(flag,tag);wl.acquire();break;case kCmdReleaseLock:if(wl!=null){wl.release();wl=null;}break;case kCmdUserActivity:pm.userActivity(SystemClock.uptimeMillis(), true);int loopCnt=msg.arg1;if(loopCnt-->0){Message msgSend=handler.obtainMessage(kCmdUserActivity, loopCnt, 0);handler.sendMessageDelayed(msgSend, 20*1000);}break;}}}}文件2 layout\main.xml:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><Buttonandroid:id="@+id/Button0"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button><Buttonandroid:id="@+id/Button1"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button><Buttonandroid:id="@+id/Button2"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button><Buttonandroid:id="@+id/Button3"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button><Buttonandroid:id="@+id/Button4"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button><Buttonandroid:id="@+id/Button5"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/Button6"android:text="@string/sleep"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button><Buttonandroid:id="@+id/Button7"android:text="@string/reboot"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button></LinearLayout><Buttonandroid:id="@+id/Button8"android:text="@string/userActivity"android:layout_width="wrap_content" android:layout_height="wrap_content"></Button></LinearLayout>文件3 values\strings.xml:<?xml version="1.0" encoding="utf-8"?><resources><string name="hello">Hello World, MainActivity!</string><string name="app_name">PowerMangerSample</string><string name="acquire_PARTIAL">acquire PARTIAL_WAKE_LOCK</string><string name="release_PARTIAL">release PARTIAL_WAKE_LOCK</string><string name="acquire_SCREEN_DIM">acquire SCREEN_DIM_WAKE_LOCK</string><string name="release_SCREEN_DIM">release SCREEN_DIM_WAKE_LOCK</string><string name="acquire_SCREEN_BRIGHT">acquire SCREEN_BRIGHT_WAKE_LOCK</string><string name="release_SCREEN_BRIGHT">release SCREEN_BRIGHT_WAKE_LOCK</string><string name="acquire_FULL_WAKE_LOCK">acquire FULL_WAKE_LOCK_WAKE_LOCK</string><string name="release_FULL_WAKE_LOCK">release FULL_WAKE_LOCK_WAKE_LOCK</string><string name="combineFlag0">combine with ACQUIRE_CAUSES_WAKEUP</string><string name="notCombineFlag0">not combine with ACQUIRE_CAUSES_WAKEUP</string><string name="combineFlag1">combine with ON_AFTER_RELEASE</string><string name="notCombineFlag1">not combine with ON_AFTER_RELEASE</string><string name="sleep">go sleep</string><string name="reboot">reboot</string><string name="userActivity">userActivity</string></resources>文件4 values\ids.xml:<resources><item type="id" name="StateKey" /><item type="id" name="TextTurnOnKey" /><item type="id" name="TextTurnOffKey" /></resources>文件5 AndroidManifest.xml :<? xml version = "1.0" encoding = "utf-8" ?><manifest xmlns:android = "http://schemas.android.com/apk/res/android"package = "com.teleca.robin"android:versionCode = "1"android:versionName = "1.0" ><application android:icon = "@drawable/icon" android:label = "@string/app_name" ><activity android:name = ".MainActivity"android:label = "@string/app_name" ><intent-filter><action android:name = "android.intent.action.MAIN" /><category android:name = "android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-sdk android:minSdkVersion = "8" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.DEVICE_POWER"/><uses-permission android:name="android.permission.REBOOT"/></manifest>