如何创建可从 android 中的并发应用程序访问其功能的后台服务?
How can I create a background service that functions are accessible from a concurrent application in android?
我希望在我的应用程序中按下按钮时启动服务。
但是,此服务需要 运行 在后台运行,并在没有 closing/restarting 的情况下维护 SQLiteConnection 对象。
我需要访问服务中的函数,这些函数将使用 liteSync 查询保存在网络服务器上的数据库。
我尝试过的;
<service
android:name=".NetworkStuff.Server"
android:enabled="true"
android:exported="true"
android:stopWithTask="false"></service>
我尝试创建并启动服务,但是当我切换活动时,服务对象被销毁。
我试过使用其他方法维护 SQLiteConnection 对象,但无济于事,例如以下代码。
public class MyApplication extends Application{
private SQLiteConnection data;
public SQLiteConnection getData() {
return data;
}
public void setData(SQLiteConnection data) {
this.data = data;
}
我能够正确使用 SQLiteConnection 对象的唯一方法是在一个 activity 中完成所有操作(插入、select、更新、删除)。
因此,我研究了 运行ning 一个包含上述所有查询函数的并发应用程序(永远不会关闭),然后客户端应用程序将调用这些函数,甚至不需要看到 SQLiteConnection 对象。
从那以后,我被引导到一个后台服务,正是这样做的。
我看到和尝试过的所有示例似乎都没有 运行 在我的应用程序之外(我无法通过 android 设置在 "Running Services" 中看到它们)
How to call methods of a Service from activity?
https://github.com/MysticMagic/ServiceAndSqlite
我如何启动一项服务 class 来处理前面提到的,而不必 close/restart 我可以从应用程序访问它?
--回复评论--
我很擅长与数据库通信,但是是的,我想要一个连续 运行ning 服务,该服务将与托管在服务器上的数据库进行通信。
更多信息;
io.liteglue.SQLiteConnection;
我正在使用一个名为 litesync 的库,我只需要一个 SQliteConnection 对象,该对象将由持续 运行ning 服务维护。此服务将需要执行语句(只是 运行 一个类似于下面的函数)
public ArrayList<String> getData(String statement) {
ArrayList<String> results = new ArrayList<>();
try {
SQLiteStatement mystatement;
try {
mystatement = mydbc.prepareStatement(statement);
} catch (SQLException ex) {
return results;
}
while (mystatement.step()) {
results.add(mystatement.getColumnTextNativeString(0));
}
mystatement.dispose();
}
catch (SQLException ex) {
return results;
}
return results;
}
这里的主要 objective 是使用相同的 SQLiteConnection 对象(它保存服务器数据库的地址)
我已经能够 运行 我需要的所有功能,但是它会随机断开连接并停止更新主要部分。因此,我正在寻找一个单一的连续后台服务,它将处理对永远不会关闭的 SQLiteConnection 对象的所有调用,并在一个 class 中执行所有操作。
您必须创建一个位于分离进程中的 IntentService(它有自己的线程)(我认为这一步可以是可选的,但我建议让它位于自己的进程中)然后使用 "AIDL inter-process-communication technique" 在 Activities/Apps 和此服务之间进行通信。在这里写完所有代码是不可能的,但我会给你一些提示:
- 创建 IntentService
- 创建一个 AIDL 文件,说明您希望从此服务使用的所有方法
- 从 Android 6 开始,所有 "permanent" 服务应在 运行 时显示通知,因此您必须在前台设置该服务
- 做一个 "startService()"/"startForegroundService()",然后做一个 "bindService()"
- 绑定服务将为您提供一个接口(基于该 AIDL 文件),您通常可以使用该接口执行暴露的服务方法,因为它们存在于同一个 "client" 应用程序
- 当客户端应用程序关闭时不要忘记"unbindService()"
调试(使用 Android Studio 中的断点)分离进程可能很困难,因此我建议在同一进程中完成所有工作,然后仅在完成所有工作后才切换到分离进程。
我希望在我的应用程序中按下按钮时启动服务。
但是,此服务需要 运行 在后台运行,并在没有 closing/restarting 的情况下维护 SQLiteConnection 对象。
我需要访问服务中的函数,这些函数将使用 liteSync 查询保存在网络服务器上的数据库。
我尝试过的;
<service
android:name=".NetworkStuff.Server"
android:enabled="true"
android:exported="true"
android:stopWithTask="false"></service>
我尝试创建并启动服务,但是当我切换活动时,服务对象被销毁。 我试过使用其他方法维护 SQLiteConnection 对象,但无济于事,例如以下代码。
public class MyApplication extends Application{
private SQLiteConnection data;
public SQLiteConnection getData() {
return data;
}
public void setData(SQLiteConnection data) {
this.data = data;
}
我能够正确使用 SQLiteConnection 对象的唯一方法是在一个 activity 中完成所有操作(插入、select、更新、删除)。 因此,我研究了 运行ning 一个包含上述所有查询函数的并发应用程序(永远不会关闭),然后客户端应用程序将调用这些函数,甚至不需要看到 SQLiteConnection 对象。 从那以后,我被引导到一个后台服务,正是这样做的。
我看到和尝试过的所有示例似乎都没有 运行 在我的应用程序之外(我无法通过 android 设置在 "Running Services" 中看到它们)
How to call methods of a Service from activity?
https://github.com/MysticMagic/ServiceAndSqlite
我如何启动一项服务 class 来处理前面提到的,而不必 close/restart 我可以从应用程序访问它?
--回复评论--
我很擅长与数据库通信,但是是的,我想要一个连续 运行ning 服务,该服务将与托管在服务器上的数据库进行通信。 更多信息; io.liteglue.SQLiteConnection; 我正在使用一个名为 litesync 的库,我只需要一个 SQliteConnection 对象,该对象将由持续 运行ning 服务维护。此服务将需要执行语句(只是 运行 一个类似于下面的函数)
public ArrayList<String> getData(String statement) {
ArrayList<String> results = new ArrayList<>();
try {
SQLiteStatement mystatement;
try {
mystatement = mydbc.prepareStatement(statement);
} catch (SQLException ex) {
return results;
}
while (mystatement.step()) {
results.add(mystatement.getColumnTextNativeString(0));
}
mystatement.dispose();
}
catch (SQLException ex) {
return results;
}
return results;
}
这里的主要 objective 是使用相同的 SQLiteConnection 对象(它保存服务器数据库的地址)
我已经能够 运行 我需要的所有功能,但是它会随机断开连接并停止更新主要部分。因此,我正在寻找一个单一的连续后台服务,它将处理对永远不会关闭的 SQLiteConnection 对象的所有调用,并在一个 class 中执行所有操作。
您必须创建一个位于分离进程中的 IntentService(它有自己的线程)(我认为这一步可以是可选的,但我建议让它位于自己的进程中)然后使用 "AIDL inter-process-communication technique" 在 Activities/Apps 和此服务之间进行通信。在这里写完所有代码是不可能的,但我会给你一些提示:
- 创建 IntentService
- 创建一个 AIDL 文件,说明您希望从此服务使用的所有方法
- 从 Android 6 开始,所有 "permanent" 服务应在 运行 时显示通知,因此您必须在前台设置该服务
- 做一个 "startService()"/"startForegroundService()",然后做一个 "bindService()"
- 绑定服务将为您提供一个接口(基于该 AIDL 文件),您通常可以使用该接口执行暴露的服务方法,因为它们存在于同一个 "client" 应用程序
- 当客户端应用程序关闭时不要忘记"unbindService()"
调试(使用 Android Studio 中的断点)分离进程可能很困难,因此我建议在同一进程中完成所有工作,然后仅在完成所有工作后才切换到分离进程。