在 Clojure 中创建 Android 服务
Creating an Android Service in Clojure
我有一个相当简单的应用程序,它是我用 Clojure 编写的,我想定期自动执行其中一个功能。我正在尝试使用 Android 的 AlarmManager
来安排任务。这是我目前所拥有的:
Android的参考文档enter link description here
public class HelloIntentService extends IntentService {
/**
* A constructor is required, and must call the super IntentService(String)
* constructor with a name for the worker thread.
*/
public HelloIntentService() {
super("HelloIntentService");
}
/**
* The IntentService calls this method from the default worker thread with
* the intent that started the service. When this method returns, IntentService
* stops the service, as appropriate.
*/
@Override
protected void onHandleIntent(Intent intent) {
// Normally we would do some work here, like download a file.
// For our sample, we just sleep for 5 seconds.
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Restore interrupt status.
Thread.currentThread().interrupt();
}
}
}
我自己在Clojure方面的进步:
(gen-class
:name adamdavislee.mpd.Service
:extends android.app.IntentService
:exposes-methods {IntentService superIntentService}
:init init
:prefix service)
(defn service-init []
(superIntentService "service")
[[] "service"])
(defn service-onHandleIntent [this i]
(toast "hi"))
我想我误会了一些微妙的东西;在评估第一个 sexp 后,符号 adamdavislee.mpd.Service
未绑定,符号 superIntentService
.
也未绑定
将根据阅读您的代码提出一些建议(即不确定这些是否可行)
您似乎对 Java 互操作有疑问。您可以查看更多信息 here。看起来 :prefix
也应该是一个字符串。例如
(gen-class
:name adamdavislee.mpd.Service
:extends android.app.IntentService
:exposes-methods {IntentService superIntentService}
:init init
:prefix "service-") ;;---> make this a string and append '-'
(defn service-init []
(.superIntentService "service");;-> update with prepend dot-notation for Java interop
[[] "service"]) ;;-> not sure what 'service' is doing here
;; perhaps consider an atom
(defn service-onHandleIntent [this i]
(.toast "hi")) ;;=> Not sure where this method is coming from,
;; but guessing java interop need here as well
This example 也可能提供一些有用的见解。希望这有助于...
此代码有效,但前提是在添加对 gen-class
的调用后重新编译项目。 gen-class
只能在项目编译时生成类。
(gen-class
:name adamdavislee.mpd.Service
:extends android.app.IntentService
:init init
:state state
:constructors [[] []]
:prefix service-)
(defn service-init
[]
[["NameForThread"]
"NameForThread"])
(defn service-onHandleIntent
[this i]
(toast "service started"))
我有一个相当简单的应用程序,它是我用 Clojure 编写的,我想定期自动执行其中一个功能。我正在尝试使用 Android 的 AlarmManager
来安排任务。这是我目前所拥有的:
Android的参考文档enter link description here
public class HelloIntentService extends IntentService {
/**
* A constructor is required, and must call the super IntentService(String)
* constructor with a name for the worker thread.
*/
public HelloIntentService() {
super("HelloIntentService");
}
/**
* The IntentService calls this method from the default worker thread with
* the intent that started the service. When this method returns, IntentService
* stops the service, as appropriate.
*/
@Override
protected void onHandleIntent(Intent intent) {
// Normally we would do some work here, like download a file.
// For our sample, we just sleep for 5 seconds.
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Restore interrupt status.
Thread.currentThread().interrupt();
}
}
}
我自己在Clojure方面的进步:
(gen-class
:name adamdavislee.mpd.Service
:extends android.app.IntentService
:exposes-methods {IntentService superIntentService}
:init init
:prefix service)
(defn service-init []
(superIntentService "service")
[[] "service"])
(defn service-onHandleIntent [this i]
(toast "hi"))
我想我误会了一些微妙的东西;在评估第一个 sexp 后,符号 adamdavislee.mpd.Service
未绑定,符号 superIntentService
.
将根据阅读您的代码提出一些建议(即不确定这些是否可行)
您似乎对 Java 互操作有疑问。您可以查看更多信息 here。看起来 :prefix
也应该是一个字符串。例如
(gen-class
:name adamdavislee.mpd.Service
:extends android.app.IntentService
:exposes-methods {IntentService superIntentService}
:init init
:prefix "service-") ;;---> make this a string and append '-'
(defn service-init []
(.superIntentService "service");;-> update with prepend dot-notation for Java interop
[[] "service"]) ;;-> not sure what 'service' is doing here
;; perhaps consider an atom
(defn service-onHandleIntent [this i]
(.toast "hi")) ;;=> Not sure where this method is coming from,
;; but guessing java interop need here as well
This example 也可能提供一些有用的见解。希望这有助于...
此代码有效,但前提是在添加对 gen-class
的调用后重新编译项目。 gen-class
只能在项目编译时生成类。
(gen-class
:name adamdavislee.mpd.Service
:extends android.app.IntentService
:init init
:state state
:constructors [[] []]
:prefix service-)
(defn service-init
[]
[["NameForThread"]
"NameForThread"])
(defn service-onHandleIntent
[this i]
(toast "service started"))