如何创建可从android中的并发应用程序访问功能的后台服务?

时间:2018-11-15 05:51:15

标签: android sqlite android-service

我希望在我的应用程序中按下按钮时启动服务。

但是,此服务将需要在后台运行并维护SQLiteConnection对象,而无需关闭/重新启动。

我将需要访问服务中的功能,这些功能将使用liteSync查询通过网络保存在服务器上的数据库。

我尝试过的;

<service
            android:name=".NetworkStuff.Server"
            android:enabled="true"
            android:exported="true"
            android:stopWithTask="false"></service>

我尝试创建和启动服务,但是当我切换活动时,Service对象被破坏。 我尝试使用其他维护SQLiteConnection对象的方法无效,例如以下代码。

public class MyApplication extends Application{
    private SQLiteConnection data;

    public SQLiteConnection getData() {
       return data;
    }

    public void setData(SQLiteConnection data) {
        this.data = data;
    }

我能够正确使用SQLiteConnection对象的唯一方法是在一个活动中进行所有操作(插入,选择,更新,删除)。 因此,从那以后,我开始研究运行包含以上所有查询功能的并发应用程序(永远不会关闭),然后客户端应用程序将调用这些功能,甚至不需要查看SQLiteConnection对象。 从那时起,我被带到一个后台服务,正是这样做的。

我已经看过并尝试过的所有示例似乎都没有在我的应用程序之外运行(我无法通过android设置在“运行服务”中看到它们)

How to call methods of a Service from activity?

https://github.com/MysticMagic/ServiceAndSqlite

如何启动可以处理前面提到的服务类而不必关闭/重新启动可以从应用程序访问的服务类?

-回复评论-

我可以与数据库进行通信,但是可以,我想要一个持续运行的服务,该服务将与服务器上托管的数据库进行通信。 更多信息; io.liteglue.SQLiteConnection; 我正在使用一个名为litesync的库,我所需要的只是一个SQliteConnection对象,该对象由持续运行的服务维护。该服务将需要执行语句(只需运行以下功能)

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;
    }

这里的主要目标是使用相同的SQLiteConnection对象(该对象保存服务器数据库的地址)

我已经能够运行我需要的所有功能,但是它会随机断开并在主要部分停止更新。因此,我正在寻找一个单一的连续后台服务,该服务将处理对SQLiteConnection对象的所有调用,该对象永远不会关闭并且在一个类中起作用。

1 个答案:

答案 0 :(得分:1)

您必须创建一个IntentService(具有自己的线程),该进程驻留在一个单独的进程中(我认为此步骤可以是可选的,但我建议让它驻留在其自己的进程中),然后使用“ AIDL inter -过程通信技术”以在活动/应用程序与该服务之间进行通信。这里不可能编写所有代码,但我会给您一些提示:

  • 创建IntentService
  • 创建一个AIDL文件,该文件将列出您希望通过此服务使用的所有方法
  • 从Android 6开始,所有“永久”服务均应在运行时显示通知,因此您必须将该服务置于前台。
  • 先执行“ startService()” /“ startForegroundService()”,然后再执行“ bindService()”
  • 绑定服务将为您提供一个接口(基于该AIDL文件),您可以使用该接口正常执行公开服务的方法,因为它们存在于同一“客户端”应用程序中
  • 关闭客户端应用程序时,请不要忘记“ unbindService()”

调试(使用Android Studio中的断点)一个单独的过程可能很困难,因此我建议在同一过程中完成所有工作,然后仅在完成所有工作后才切换到单独。