CONNECTBOT改造4-增加定时发送文本功能
首先描述一下connectbot的调用逻辑。
HostListActivity.java是主机列表的Activity,再这里可以输入主机或点击保存的主机进行连接。会新建一个终端窗口ConsoleActivity:
Intent intent = new Intent(HostListActivity.this, ConsoleActivity.class);
注意:这里不管是新连接还是从现有连接退出再重新进入都会重新创建一个新窗口。
在ConsoleActivity中,是通过Viewflip来实现多个终端窗口的显示,新建窗口时,会调用:
private ServiceConnection connection = new ServiceConnection()
此函数会遍历所有bridge,为每个bridge创建一个view,然后将这些view加入到flip:
for (TerminalBridge bridge : bound.bridges) {
final int currentIndex = addNewTerminalView(bridge);
flip会检测屏幕手势,如果水平左右滑动,会进行不同终端view的切换:
final GestureDetector detect = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
在每一个view当中,会保存view和bridge的关联。
从上面描述可以看出,如果要实现文本插入和终端绑定,必须在bridge中修改,需要修改的是src\main\java\org\ywb_ipop\service\TerminalBridge.java。
1、加入定时器及任务
Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句,否则提示出错,需重新创建
private Timer mTimer = null;
private TimerTask mTimerTask = null;
private Handler mHandler = null;
private static int delay = 1000; //1s
private static int period = 1000; //1s
private static final int SEND_TXT_MESSAGE = 0;
private void startTimer(){
if (mTimer == null) {
mTimer = new Timer();
}
if (mTimerTask == null) {
mTimerTask = new TimerTask() {
@Override
public void run() {
// 需要做的事:发送消息
if (mHandler != null) {
Message message = Message.obtain(mHandler, SEND_TXT_MESSAGE);
mHandler.sendMessage(message);
}
}
};
}
if(mTimer != null && mTimerTask != null )
mTimer.schedule(mTimerTask, delay, period);
}
private void stopTimer(){
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
if (mTimerTask != null) {
mTimerTask.cancel();
mTimerTask = null;
}
}
在重构函数加入事件处理初始化:
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SEND_TXT_MESSAGE:
// 需要做的事:发送文本
...
break;
default:
break;
}
}
};
2、在ConsoleActivity编写发送按钮触发事件
ImageButton sendbutton = (ImageButton) findViewById(R.id.sendButton);
sendbutton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip);
TerminalBridge bridge = terminalView.bridge;
if(bridge.isendFlag==true)
{
bridge.stopSend();
}
else
{
String temps = ((TextView) findViewById(R.id.sendText)).getText().toString();
bridge.startSend(temps,1000);
}
}
});
另外需要同步按钮状态,在切换不同的窗口,重新进入窗口时读取bridge状态,更新按钮状态。
发表评论