使用AppWidgetProvider的getApplicationContext()

use*_*863 1 java android widget android-widget android-context

我正在尝试将我连接Widget到应用程序的数据库,但我一无所知。
工作原理:

import android.app.Activity;
public class Widgets1 extends Activity{
mMioDbHelper = new SqlHelper(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

这不是吗?

import android.appwidget.AppWidgetProvider;
public class Widgets1 extends AppWidgetProvider{
mMioDbHelper = new SqlHelper(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

Com*_*are 5

AppWidgetProvider扩展BroadcastReceiver,而不继承自Context。getApplicationContext()是上的方法Context。当你确定,你之所以被传递一个Context到onReceive()的BroadcastReceiver(以及onUpdate()和其他回调对AppWidgetProvider),那么你可以做的事情,需要一个Context。

综上所述,这里的代码存在问题:

  1. 请勿Context像Activity片段一样使用从初始化程序继承的方法。无法保证在该时间点可以使用这些方法。延迟使用Context方法,直到该部件的初始入口点,例如onCreate()一个Activity。

  2. 永远不要在主应用程序线程上进行数据库I / O,因为如果您的活动之一恰巧当时处于前台,它将冻结应用程序的UI。对您的所有回调AppWidgetProvider(如)onUpdate()在主应用程序线程上调用。请使用IntentService或其他可以安全运行后台线程的工具。请注意,IntentService完全能够通过来更新应用程序小部件UI AppWidgetManager。onUpdate()是触发为您做一些工作,但工作能够-而且往往时间应-在其他地方进行。

  3. 创建各种SQLiteOpenHelper实例时要非常小心,我假设这SqlHelper是的子类SQLiteOpenHelper。请为您的整个应用程序提供一个精确的实例SQLiteOpenHelper,以便您可以利用内置的线程安全性SQLiteOpenHelper。通常以单身人士告终SQLiteOpenHelper。拥有多个实例可能会使您陷入与线程相关的麻烦。