无法从ContentProvider启动服务

时间:2012-12-31 22:09:59

标签: android android-intent android-contentprovider

更新应用程序后,我需要使用来自互联网的其他数据来唯一填充数据库。为此,我实现了一个名为OnUpgradeService()的服务。应该在SQLiteOpenHelper的OnUpgrade()方法中启动此服务。

我可以看到执行了startService但没有调用onStartCommand()。

public class MyContentProvider extends ContentProvider {
    ...
    private static class MyOpenHelper extends SQLiteOpenHelper {
        ...
        public MyOpenHelper(Context context, String name, CursorFactory factory, int version) {
            super(context, name, factory, version);
            this.context = context;
        }
        ...
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if (oldVersion == 1) {
                db.execSQL(DATABASE_CREATE_THUMBNAIL);
                db.execSQL("alter table " + DATABASE_TABLE_FRIEND + " add column " + KEY_THUMBNAIL_URI + " text;");
                ...
                Intent intent = new Intent(context, OnUpgradeService.class);
                context.startService(intent);
            }
            else {
                db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_FRIEND);
                onCreate(db);
            }
        }
        ...
        public class OnUpgradeService extends Service {
            ...
            @Override
            public int onStartCommand(Intent intent, int flags, int startId) {
                Thread t = new Thread(new Runnable() {
                    public void run() {
                        upgradeDatabase();
                        stopSelf();
                    }
                });
                t.start();
                return Service.START_REDELIVER_INTENT;
            }

清单中的相关条目如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
    ...
    <application>
        ...
        <service android:enabled="true" android:name=".OnUpgradeService" /> 
        ...
    </application>
    ...
</manifest>

1 个答案:

答案 0 :(得分:2)

  

应用程序既不会崩溃也不会在LogCat中有任何提示,为什么服务没有启动

我觉得有点难以置信 - 我愿意打赌有一些与此相关的警告(不一定是错误)。

Android组件,如Service,不能是普通的内部类,因为Android无法创建实例。您的OnUpgradeService需要成为static内部班级。

然后,如果您进行了更改,那么您的清单条目是错误的,因为它声称OnUpgradeService不是任何内部类。

解决这两个问题的最简单方法是将OnUpgradeService移动到其自己的文件中作为常规顶级公共Java类。

所有这一切,如果你发现你的方法在长期运作中会很好,我会相当惊讶。像你一样从互联网上填充数据库这样的东西似乎会给你带来很多问题。就目前而言,当您被要求填充数据库时,它是相对不可预测的,因为每当有人尝试对此ContentProvider执行某些操作时,这将是相当不可预测的,这可能不是一个合适的时刻。此外,还有一个问题是用户将立即看到什么,而数据填充没有发生。我强烈建议您更认真地考虑数据同步模型,而不是将其视为随时发生的数据库模式更改的一些副作用。