【问题标题】:getApplicationContext() with AppWidgetProvider带有 AppWidgetProvider 的 getApplicationContext()
【发布时间】:2014-03-25 21:38:38
【问题描述】:

我正在尝试将我的 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());

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

谢谢。

【问题讨论】:

  • 小部件不是活动。小部件的主要目的是显示用户可以直接从主屏幕触发的常用功能。
  • @Libin 问题是另一个:如何从小部件类进行查询?我知道可以做到...谢谢:)
  • getContentResolver()
  • @Blundell 它不适用于AppWidgetProvider :(
  • 已解决使用context.getApplicationContext(),无论如何谢谢:D

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


【解决方案1】:

AppWidgetProvider 扩展 BroadcastReceiver,而后者又不继承自 ContextgetApplicationContext()Context 上的一个方法。正如您所确定的,将Context 传递给BroadcastReceiveronReceive()(以及onUpdate()AppWidgetProvider 上的其他回调)的原因是您可以做需要Context 的事情。

话虽如此,你这里的代码有问题:

  1. 不要使用从初始化器中继承自 Context 的方法,就像使用 Activity sn-p 一样。无法保证这些方法在那个时间点可以使用。使用Context 方法延迟到组件的初始入口点,例如ActivityonCreate()

  2. 永远不要在主应用程序线程上执行数据库 I/O,因为如果您的某个活动恰好在此时处于前台,它将冻结您的应用程序的 UI。对AppWidgetProvider 的所有回调,例如onUpdate(),都在主应用程序线程上调用。请使用IntentService 或其他可以安全运行后台线程的东西。请注意,IntentService 完全能够通过AppWidgetManager 更新应用小部件 UI。 onUpdate() 是一个触发器让您完成某些工作,但这项工作可以——而且通常应该——在其他地方完成。

  3. 在创建各种SQLiteOpenHelper 实例时要非常小心,我假设SqlHelperSQLiteOpenHelper 的子类。请为您的整个应用程序准确地一个 使用您的SQLiteOpenHelper 实例,以便您可以利用SQLiteOpenHelper 中内置的线程安全性。这通常会成为一个单身SQLiteOpenHelper。拥有多个实例可能会给您带来与线程相关的麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2013-07-02
    相关资源
    最近更新 更多