AndroidフレームワークではIActivityManager.shutdown()をCallして電源OFFを開始しているので、このinternal methodをアプリから直接呼び出すコードを書きます。
もちろんpermissionがない(というかrootが必要)ということで全く動作しません。
あくまでinternalなmethodの呼び出し方、ということで、書いておきます。
(internalの呼び出しはデメリットが多いので使うことないかもしれないけど)
なお、39行目で、メソッドを探すためにループしてますが、getMethod()をつかって一発で取り出すことも出来ます。
package test.alarm;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class AlarmTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.shutdown);
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
ClassLoader cl = getClassLoader();
try
{
Class ActivityManagerNative = Class.forName("android.app.ActivityManagerNative");
Class IActivityManager = Class.forName("android.app.IActivityManager");
Method getDefault = ActivityManagerNative.getMethod("getDefault", null);
Object am = IActivityManager.cast(getDefault.invoke(ActivityManagerNative, null));
Method[] shutdown = am.getClass().getMethods();//, Integer.class);
Method sd = null;
for (int i = 0; i < shutdown.length; i++)
{
if (shutdown[i].getName().equals("shutdown"))
{
Log.d("method", shutdown[i].getName());
Log.d("method", shutdown[i].toString());
sd = shutdown[i];
}
}
if (am != null && sd != null) {
sd.invoke(am, 10);
//am.shutdown(MAX_BROADCAST_TIME);
}
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (NoSuchMethodException e)
{
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
0 件のコメント:
コメントを投稿