带有AppWidgetProvider的getApplicationContext()

时间:2014-03-25 21:38:38

标签: java android android-widget widget android-context

我正在尝试将我的Widget连接到应用的数据库,但我不明白。
为什么会这样:

import android.app.Activity;
public class Widgets1 extends Activity{
mMioDbHelper = new SqlHelper(getApplicationContext());

这不是吗?

import android.appwidget.AppWidgetProvider;
public class Widgets1 extends AppWidgetProvider{
mMioDbHelper = new SqlHelper(getApplicationContext());

如何将小部件连接到数据库?我的意思是如何从widget类中进行查询?

感谢。

1 个答案:

答案 0 :(得分:5)

AppWidgetProvider扩展BroadcastReceiver,而Context则不会继承getApplicationContext()ContextContext上的一种方法。正如您所确定的那样,您onReceive() BroadcastReceiver onUpdate() AppWidgetProvider以及Context上的Context和其他回调的原因是{...}}做需要Activity的事情。

所有这些,你在这里的代码有问题:

  1. 请勿使用初始化程序中从Context继承的方法,就像使用onCreate()代码段一样。无法保证此类方法随时可用。延迟使用Activity方法直到组件的初始入口点,例如AppWidgetProvider的{​​{1}}。

  2. 永远不要在主应用程序线程上执行数据库I / O,因为如果您的某个活动恰好位于前台,它将冻结您的应用程序的UI。所有对onUpdate()的回调,如IntentService,都会在主应用程序线程上调用。请使用IntentService或其他可安全运行后台线程的内容。请注意,AppWidgetManager完全有能力通过onUpdate()更新应用小部件用户界面。 SQLiteOpenHelper是一个触发器,供您进行某些工作,但该工作可以 - 而且通常应该 - 在其他地方完成。

  3. 在创建各种SqlHelper实例时要非常小心,我假设SQLiteOpenHelperSQLiteOpenHelper的子类。请为您的整个应用程序提供SQLiteOpenHelper一个实例,以便您可以利用SQLiteOpenHelper中内置的线程安全性。这通常会成为一个单身{{1}}。拥有多个实例可能会让您遇到与线程相关的问题。