确保在活动部分之前执行服务

时间:2013-02-20 13:52:18

标签: android android-activity android-service

我有一些应用程序包含一些活动。这些活动需要公共资源(矩阵数组列表),因此为了避免多次重新加载这些资源(当更改为另一个活动或更改方向时),我已经创建了一个服务。

首先我用 startService(Intent)来调用它,让它变粘。 之后,我将服务绑定到活动, bindService(sIntent,mConnection,BIND_AUTO_CREATE);

最后,我有一些代码尝试从服务中获取数据,但它会生成NullPointerException。我知道这是因为(正如我在日志中看到的)服务在应用程序崩溃后启动,尽管我在访问数据代码之前放了 startService bindService

任何人都知道如何在尝试访问数据之前确保加载数据?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可能更容易在SharedPreference中保存公共资源,SharedPreference可由应用程序的所有线程访问,并且在运行之间是持久的。这取决于您的资源。

如果您希望自己的服务适用于您的方法you could do this with a transparent ActivityAsyncTask可能是一个更简单,更简单的解决方案。

尝试使用AsyncTask加载您的数据,您可以选择加载时活动所做的任何内容(进度对话框?),并确保使用后的数据继续使用您的应用>当您的AsyncTask调用ready方法(onPostExecute())时。这意味着AsyncTask将把您的服务理念替换为后台线程,管理您的资源。 (加载,下载等)。

下次发布您的日志时,他们可能会提供帮助。

答案 1 :(得分:1)

在扩展onCreate()的班级的Application中启动您的服务。或者更好的是,在Application类中执行Service所做的工作,保证在应用程序的任何其他部分之前创建。服务可能需要一段时间才能启动,您可能会遇到竞争条件,但扩展应用程序的类总是要启动的应用程序的第一部分。

答案 2 :(得分:0)

我最近遇到了这个问题并创建了一个解决方案。类似于无形活动,但想法是创建一个" loading"不需要服务的活动。这是一个例子:

在AndriodManifest.xml中

...
<application
    ... >
    <activity 
        android:name="com.example.LoadingActivity"
        android:label="@string/app_name" >
        <!-- A do-nothing activity that is used as a placeholder while the service is started. -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.MyActivity"
        android:label="@string/app_name" >
        <!-- The real activity, started by the loading activity. -->
    </activity>
    <service
        android:name="com.example.MyService" >
        <!-- The background service, started by the loading activity. -->
    </service>
</application>
...

COM /示例/ LoadingActivity.java:

package com.example;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class LoadingActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_loading);

        super.startService(new Intent(this, MyService.class)); // listed first so it will start before the activity
        Intent intent = new Intent(this, MyActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // makes it so the 'loading' activity is not kept on the back-stack
        super.startActivity(intent);
    }
}

MyActivity.java和MyService.java文件只是标准的。您还需要一个activity_loading.xml布局资源,可能只是一个ImageView。