作者nesk (大棵)
看板AndroidDev
标题[问题] 开机後执行脚本问题
时间Fri Dec 13 18:43:14 2013
目前来说我用一个broadcastreceiver来接收boot complete的broadcast
程式码如下
package com.example.testactivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import android.content.SharedPreferences;
public class boot_complete_receiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
SharedPreferences setting =arg0.getSharedPreferences("AUTO_TEST" ,0);
Boolean boot_test =setting.getBoolean("BOOT_TEST",true);
if(boot_test){
Toast toast = new Toast(arg0);
toast.makeText(
arg0,"boot complete",Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(arg0, startscript.class);
arg0.startService(myIntent);
}
}
}
他会呼叫一个service来执行存在特定地点的脚本
程式码如下
package com.example.testactivity;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class startscript extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.e("startscript", "service start");
boolean command = false;
// 建立FileReader物件,并设定读取的档案为SD卡中的output.txt档案
Process process = null;
try {
process = Runtime.getRuntime().exec("sh");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DataOutputStream out = new DataOutputStream(process.getOutputStream());
// try {
// out.writeBytes(" input key event 22 \n");
// out.writeBytes(" input key event 22 \n");
// out.writeBytes("sleep 0.247");
// out.writeBytes(" input key event 22 \n");
// out.writeBytes("sleep 1.112");
// out.writeBytes(" input key event 22 \n");
// out.writeBytes("sleep 0.244");
// out.writeBytes(" input key event 21 \n");
// out.writeBytes("sleep 0.342");
// out.writeBytes(" input key event 21 \n");
// out.writeBytes("sleep 0.246");
// out.writeBytes(" input key event 23 \n");
// out.writeBytes("sleep 0.668");
// out.writeBytes(" input key event 23 \n");
// out.writeBytes("sleep 0.416");
// } catch (IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
// try {
// out.flush();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
FileReader fr = null;
try {
fr = new FileReader("/system/app/output.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 将BufferedReader与FileReader做连结
BufferedReader br = new BufferedReader(fr);
String readData = "";
String temp = null;
try {
temp = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // readLine()读取一整行
String shell_command;
String[] test;
while (temp != null) {
if (temp.contains("End Sub")) {
command = false;
try {
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (command) {
if (temp.indexOf("\"") != -1) {
shell_command = temp.substring(temp.indexOf("\"") + 1,
temp.lastIndexOf("\""));
Log.e("start script", shell_command);
try {
out.writeBytes(shell_command + "\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
test = temp.split(" ");
Log.e("start script", test[1]);
try {
out.writeBytes("sleep "
+ String.valueOf(Float.parseFloat(test[1]) / 1000)
+ "\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if (temp.contains("Sub Main")) {
command = true;
}
try {
temp = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.e("startscript", "service stop");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
可是目前发现开机後执行的脚本会跟原本所录制的脚本有差异
应该有少一两个input keyevent
可是从log看起来所有的指令都有进到DataOutputStream
不知道是否有人有遇过这种情况
本来是猜可能跟脚本放在sd card有关
不过後来是试过觉得不是
如果用直接呼叫service的方式来执行脚本的话没有问题
可是如果用boot complete後startservice的方式就有问题
请问有哪位大大可以给我一点提示
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.137.25.223