add timers modules

This commit is contained in:
hyb1996
2017-07-21 11:24:02 +08:00
parent 85216477c4
commit 8f2a088111
26 changed files with 365 additions and 152 deletions

View File

@@ -54,6 +54,11 @@
"type": "markdown",
"path":"documentation"
},
{
"title": "定时器",
"type": "markdown",
"path":"documentation"
},
{
"title": "shell命令",
"type": "markdown",

View File

@@ -110,6 +110,21 @@ events.loop();
删除所有事件监听函数。
### events.setTimeout(callback, delay)
* callback \<Function\> 回调函数
* delay \<Number\> 延迟
延迟大约delay毫秒后执行callback。该函数只有在events.loop()被使用时才有效。
返回一个整数表示这个设置的timeout, 可由clearTimeout取消。
### events.clearTimeout(id)
* id \<Number\> 由 setTimeout() 返回的 ID 值。该值标识要取消的延迟执行回调。
取消由 setTimeout() 方法设置的 timeout。
### key事件
当有按键被按下或弹起时会触发该事件。

View File

@@ -0,0 +1,66 @@
timer 模块暴露了一个全局的 API用于在某个未来时间段调用调度函数。 因为定时器函数是全局的,所以使用该 API 无需调用 timer.***
Auto.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API除了它使用了一个不同的内部实现它是基于 Android Looper-Handler机制构建的。其实现机制与Node.js比较相似。
不同于Web浏览器和Node.js在Auto.js中必须显式地调用loop()函数开始Looper循环才能使所有计时器开始工作。loop()函数是一个"死循环", 在他之后的语句将不会被执行。
### loop()
开始Looper循环。使所有定时器工作所必须。
注意何时调用loop不会影响setTimeout等函数的计时例如
```
setTimout(function(){
toast("hello");
exit();
}, 2000);
sleep(1000);
loop();
```
这段代码将在运行后大约2秒显示"hello"。
### setImmediate(callback\[, ...args\])
* callback \<Function\> 在 Auto.js 循环的当前回合结束时要调用的函数。
* ...args \<any\> 当调用 callback 时要传入的可选参数。
预定立即执行的 callback它是在 I/O 事件的回调之后被触发。 返回一个用于 clearImmediate() 的 id。
当多次调用 setImmediate() 时callback 函数会按照它们被创建的顺序依次执行。 每次事件循环迭代都会处理整个回调队列。 如果一个立即定时器是被一个正在执行的回调排入队列的,则该定时器直到下一次事件循环迭代才会被触发。
### setInterval(callback, delay\[, ...args\])
* callback \<Function\> 当定时器到点时要调用的函数。
* delay \<number\> 调用 callback 之前要等待的毫秒数。
* ...args \<any\> 当调用 callback 时要传入的可选参数。
预定每隔 delay 毫秒重复执行的 callback。 返回一个用于 clearInterval() 的 id。
当 delay 小于 0 时delay 会被设为 0。
### setTimeout(callback, delay\[, ...args\])
* callback \<Function\> 当定时器到点时要调用的函数。
* delay \<number\> 调用 callback 之前要等待的毫秒数。
* ...args \<any\> 当调用 callback 时要传入的可选参数。
预定在 delay 毫秒之后执行的单次 callback。 返回一个用于 clearTimeout() 的 id。
callback 可能不会精确地在 delay 毫秒被调用。 Auto.js 不能保证回调被触发的确切时间,也不能保证它们的顺序。 回调会在尽可能接近所指定的时间上调用。
当 delay 小于 0 时delay 会被设为 0。
setImmediate()、setInterval() 和 setTimeout() 方法每次都会返回表示预定的计时器的id。 它们可用于取消定时器并防止触发。
### clearImmediate(id)#
* id \<Number\> 一个 setImmediate() 返回的 id。
取消一个由 setImmediate() 创建的 Immediate 对象。
### clearInterval(id)#
* id \<Number\> 一个 setInterval() 返回的 id。
取消一个由 setInterval() 创建的 Timeout 对象。
### clearTimeout(id)
* id \<Number\> 一个 setTimeout() 返回的 id。
取消一个由 setTimeout() 创建的 Timeout 对象。

View File

@@ -20,7 +20,7 @@ events.on("key", function(code, event){
}
});
events.loop();
loop();

View File

@@ -9,4 +9,4 @@ events.on("touch", function(point){
log(point);
});
events.loop();
loop();

View File

@@ -3,29 +3,22 @@
var 长按间隔 = 1500;
var curPackage = null;
var backPressedCount = 0;
var backPressed = false;
var timeoutId = null;
events.observeKey();
events.onKeyDown("back", function(event){
curPackage = currentPackage();
backPressed = true;
backPressedCount++;
(function(count){
events.setTimeout(function(){
if(backPressed && count == backPressedCount){
backBackBackBack();
}
}, 长按间隔);
})(backPressedCount);
timeoutId = setTimeout(function(){
backBackBackBack();
}, 长按间隔);
});
events.onKeyUp("back", function(event){
backPressed = false;
clearTimeout(timeoutId);
});
events.loop();
loop();
function backBackBackBack(){
while(curPackage == currentPackage()){

View File

@@ -15,20 +15,20 @@ events.onKeyDown("volume_up", function(event){
});
events.onKeyDown("volume_down", function(event){
stop();
toast("程序结束");
exit();
});
task();
events.loop();
loop();
function task1(){
toast("任务1运行中音量下键结束音量上键切换任务");
events.setTimeout(task, interval);
setTimeout(task, interval);
}
function task2(){
toast("任务2运行中音量下键结束音量上键切换任务");
events.setTimeout(task, interval);
setTimeout(task, interval);
}

View File

@@ -0,0 +1,15 @@
toast("静等20秒你会看到想看的...");
var i = 0;
setTimeout(function(){
app.openUrl("http://music.163.com/#/song?id=109628&autoplay=true&market=baiduhd");
exit();
}, 20 * 1000);
setInterval(function(){
i++;
toast(i * 5 + "秒");
}, 5000);
loop();

View File

@@ -0,0 +1,11 @@
var i = 0;
setInterval(function(){
i++;
toast(i * 4 + "秒");
if(i == 5){
exit();
}
}, 4000);
loop();

View File

@@ -40,8 +40,6 @@ public class App extends MultiDexApplication {
return instance.get();
}
private VolumeChangeObserver mVolumeChangeObserver = new VolumeChangeObserver();
public void onCreate() {
super.onCreate();
instance = new WeakReference<>(this);
@@ -74,19 +72,12 @@ public class App extends MultiDexApplication {
}
private void initVolumeChangeObserver() {
//registerReceiver(mVolumeChangeObserver, new IntentFilter(VolumeChangeObserver.ACTION_VOLUME_CHANGE));
mVolumeChangeObserver.addOnVolumeChangeListener(new VolumeChangeObserver.OnVolumeChangeListener() {
@Override
public void onVolumeChange() {
if (Pref.isRunningVolumeControlEnabled()) {
AutoJs.getInstance().getScriptEngineService().stopAllAndToast();
}
}
});
AccessibilityService.getStickOnKeyObserver().addListener(new OnKeyListener() {
@Override
public void onKeyEvent(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && Pref.isRunningVolumeControlEnabled()) {
if (event.getAction() == KeyEvent.ACTION_DOWN &&
(keyCode == KeyEvent.KEYCODE_VOLUME_UP)
&& Pref.isRunningVolumeControlEnabled()) {
AutoJs.getInstance().getScriptEngineService().stopAllAndToast();
}
}
@@ -94,10 +85,6 @@ public class App extends MultiDexApplication {
}
public VolumeChangeObserver getVolumeChangeObserver() {
return mVolumeChangeObserver;
}
public UiHandler getUiHandler() {
return mUiHandler;
}

View File

@@ -4,12 +4,12 @@ import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.SwitchCompat;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.stardust.app.VolumeChangeObserver;
import com.stardust.autojs.runtime.record.Recorder;
import com.stardust.autojs.runtime.record.accessibility.AccessibilityActionRecorder;
import com.stardust.autojs.runtime.record.inputevent.KeyObserver;
@@ -22,6 +22,8 @@ import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
import com.stardust.scriptdroid.ui.main.MainActivity;
import com.stardust.util.MessageEvent;
import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.view.accessibility.OnKeyListener;
import org.greenrobot.eventbus.Subscribe;
@@ -62,10 +64,12 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
private Context mContext;
private boolean mDiscard = false;
private KeyObserver mKeyObserver;
private VolumeChangeObserver.OnVolumeChangeListener mOnVolumeChangeListener = new VolumeChangeObserver.OnVolumeChangeListener() {
private OnKeyListener mVolumeKeyListener = new OnKeyListener() {
@Override
public void onVolumeChange() {
if (Pref.isRecordVolumeControlEnable()) {
public void onKeyEvent(int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN &&
(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
&& Pref.isRecordVolumeControlEnable()) {
if (mRecorder == null) {
startRecord();
} else if (alreadyStartedRecord()) {
@@ -80,7 +84,10 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
mView = View.inflate(context, R.layout.floating_window_record, null);
ButterKnife.bind(this, mView);
HoverMenuService.getEventBus().register(this);
App.getApp().getVolumeChangeObserver().addOnVolumeChangeListener(mOnVolumeChangeListener);
AccessibilityService.getStickOnKeyObserver().addListener(mVolumeKeyListener);
if (Pref.isRecordVolumeControlEnable()) {
AutoJs.getInstance().ensureServiceEnabled();
}
if (Pref.hasRecordTrigger()) {
mKeyObserver = new KeyObserver(mContext);
mKeyObserver.startListening();
@@ -181,7 +188,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
public void onMenuExit() {
HoverMenuService.getEventBus().unregister(this);
App.getApp().getVolumeChangeObserver().removeOnVolumeChangeListener(mOnVolumeChangeListener);
AccessibilityService.getStickOnKeyObserver().addListener(mVolumeKeyListener);
if (mKeyObserver != null) {
mKeyObserver.stopListening();
}

View File

@@ -81,8 +81,8 @@
<string name="text_file_write_fail">文件写入失败</string>
<string name="text_join_qq_group">加入QQ互赞&amp;交流群</string>
<string name="text_copied">已复制到剪贴板</string>
<string name="text_use_volume_control_record">使用音量键控制</string>
<string name="summary_use_volume_control_record">开启后每次音量变化会开始或停止脚本录制</string>
<string name="text_use_volume_control_record">使用音量键控制</string>
<string name="summary_use_volume_control_record">开启后每次音量下键会开始或停止脚本录制</string>
<string name="key_use_volume_control_record">key_use_volume_control_record</string>
<string name="text_mobile_qq_not_installed">未安装手机QQ</string>
<string name="text_edit">编辑</string>
@@ -129,7 +129,7 @@
<string name="go_to_accessibility_settings"><![CDATA[请打开设置->无障碍服务->AutoJs并开启]]></string>
<string name="text_script_running">脚本运行</string>
<string name="key_use_volume_control_running">key_use_volume_control_running</string>
<string name="text_use_volume_to_stop_running">每次音量键变化停止所有脚本</string>
<string name="text_use_volume_to_stop_running">音量上键停止所有脚本</string>
<string name="text_need_to_enable_accessibility_service">需要启用无障碍服务</string>
<string name="key_run_mode">运行方式</string>
<string name="text_on">已开启</string>