Android 当IntentService更改SQLite中的值时更改UI

Android 当IntentService更改SQLite中的值时更改UI,android,android-sqlite,Android,Android Sqlite,我有一个Intent服务在后台运行,它可以更改设备SQLite数据库中存储的一些值。在前台打开了一个用户可见的活动。 该活动向用户显示一些值,这些值正由Intent服务更改。 如何在不要求用户刷新活动的情况下更改这些值并与SQLite同步 Android OS:Oreo有几种方法可以实现这一点,其中之一就是使用界面 在用: public class MyService extends Service { private Callbacks callback; //Other cod

我有一个
Intent服务
在后台运行,它可以更改设备
SQLite
数据库中存储的一些值。在前台打开了一个用户可见的活动。 该活动向用户显示一些值,这些值正由
Intent服务更改。
如何在不要求用户刷新活动的情况下更改这些值并与SQLite同步


Android OS:Oreo有几种方法可以实现这一点,其中之一就是使用界面

在用

public class MyService extends Service {
   private Callbacks callback;

   //Other codes
   //.....

   callback.updateClient(data) //trigger interface callback in appropriate place

   //Other codes
   //.....
   public interface Callbacks{ //define interface according to your need 
     public void updateClient(long data);
   }
}
活动中:

   public class MainActivity extends Activity implements MyService.Callbacks{
       @Override
       public void updateClient(long data) {
         // change UI 
       }
   }
public class NewAppWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
            DatabaseQuoteHelper databaseQuoteHelper = DatabaseQuoteHelper.newInstance(context);
            List<Quote> quoteList = databaseQuoteHelper.getAllQuotes();

            if (!quoteList.isEmpty()) {
                Random random = new Random();
                int rdIndex = random.nextInt(quoteList.size() - 1);
                CharSequence quoteContent = quoteList.get(rdIndex).getQuoteContentVN();
                CharSequence authorName = quoteList.get(rdIndex).getQuoteAuthorName();
                remoteViews.setTextViewText(R.id.appwidget_TvQuoteContent, quoteContent);
                remoteViews.setTextViewText(R.id.appwidget_textAuthorName, authorName);
            } else {
                remoteViews.setTextViewText(R.id.appwidget_TvQuoteContent, context.getString(R.string.not_quote_save));
                remoteViews.setTextViewText(R.id.appwidget_textAuthorName, context.getString(R.string.app_name));
            }

            Intent refresh = new Intent(context, NewAppWidget.class);
            refresh.setAction("android.appwidget.action.APPWIDGET_UPDATE");
            refresh.putExtra("appWidgetIds", appWidgetIds);
            PendingIntent pendingIntentRefresh = PendingIntent.getBroadcast(context, 0, refresh, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.widgetBtnReload, pendingIntentRefresh);
            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }
    }


    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
    }

    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }
}

在我的应用程序中,我运行服务以更新小部件,在MainActivity中启动服务:

private void startService() {
        startService(new Intent(MainActivity.this, LoadQuotesService.class));
    }
类加载引用服务

类报警管理器道路卡斯特罗接收器

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
    final public static String ONE_TIME = "onetime";
    private DatabaseQuoteHelper databaseQuoteHelper;
    private QuoteBusiness quoteBusiness;
    private final String TAG = "AlarmManagerBroadcastReceiver";


    @Override
    public void onReceive(Context context, Intent intent) {
        databaseQuoteHelper = DatabaseQuoteHelper.newInstance(context);
        quoteBusiness = QuoteBusiness.newInstance(context);
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        assert pm != null;
        PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
        wakeLock.acquire(10 * 60 * 1000L /*10 minutes*/);

        Bundle extras = intent.getExtras();
        StringBuilder stringBuilder = new StringBuilder();
        if (extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)) {
            stringBuilder.append("One time Timer : ");
        }
        @SuppressLint("SimpleDateFormat") Format formatter = new SimpleDateFormat("hh:mm:ss a");
        stringBuilder.append(formatter.format(new Date()));
        new GetRandomQuote().execute();
        wakeLock.release();
    }

    @SuppressLint("StaticFieldLeak")
    class GetRandomQuote extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            quoteBusiness.getListQuote(Api.GET_LIST_QUOTES_BY_TREND + "NEW/50", new IQuoteListener() {
                @Override
                public void start() {
                }

                @Override
                public void result(List<Quote> quoteList) {
                    if (databaseQuoteHelper.getAllQuotes().size() > 0) {
                        databaseQuoteHelper.deleteAllData();
                    }
                    for (int i = 0; i < quoteList.size(); i++) {
                        Quote quote = quoteList.get(i);
                        databaseQuoteHelper.insertQuote(quote);
                    }
                }

                @Override
                public void nil(String message) {
                }

                @Override
                public void error(String err) {

                }
            });

            return null;
        }
    }


    @SuppressLint("ShortAlarm")
    public void SetAlarm(Context context) {
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.FALSE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        assert am != null;
        int ONE_DAY = 1000 * 60 * 60 * 24;
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), ONE_DAY, pendingIntent);
    }

    public void CancelAlarm(Context context) {
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        assert alarmManager != null;
        alarmManager.cancel(sender);
    }

    public void setOnetimeTimer(Context context) {
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.TRUE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        assert am != null;
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
    }
}
公共类AlarmManagerBroadcastReceiver扩展广播接收器{
最终公共静态字符串ONE_TIME=“onetime”;
私有数据库QuoteHelper数据库QuoteHelper;
私人报价商业报价商业;
私有最终字符串标记=“AlarmManagerBroadcastReceiver”;
@凌驾
公共void onReceive(上下文、意图){
databaseQuoteHelper=databaseQuoteHelper.newInstance(上下文);
quoteBusiness=quoteBusiness.newInstance(上下文);
PowerManager pm=(PowerManager)context.getSystemService(context.POWER\u服务);
断言pm!=null;
PowerManager.WakeLock WakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,“您的标签”);
wakeLock.acquire(10*60*1000L/*10分钟*/);
Bundle extras=intent.getExtras();
StringBuilder StringBuilder=新的StringBuilder();
if(extras!=null&&extras.getBoolean(一次,Boolean.FALSE)){
追加(“一次性计时器:”);
}
@SuppressLint(“SimpleDataFormat”)格式格式化程序=新的SimpleDataFormat(“hh:mm:ss a”);
append(formatter.format(newdate());
新建GetRandomQuote().execute();
wakeLock.release();
}
@SuppressLint(“StaticFieldLeak”)
类GetRandomQuote扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的空位背景(空位…空位){
quoteBusiness.getListQuote(Api.GET\u LIST\u QUOTES\u BY\u TREND+“NEW/50”,NEW iNoteListener(){
@凌驾
公开作废开始(){
}
@凌驾
公共作废结果(列表引用列表){
如果(databaseQuoteHelper.getAllQuotes().size()>0){
databaseQuoteHelper.deleteAllData();
}
对于(int i=0;i
加载数据完成后,我会在我的小部件中显示:

   public class MainActivity extends Activity implements MyService.Callbacks{
       @Override
       public void updateClient(long data) {
         // change UI 
       }
   }
public class NewAppWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
            DatabaseQuoteHelper databaseQuoteHelper = DatabaseQuoteHelper.newInstance(context);
            List<Quote> quoteList = databaseQuoteHelper.getAllQuotes();

            if (!quoteList.isEmpty()) {
                Random random = new Random();
                int rdIndex = random.nextInt(quoteList.size() - 1);
                CharSequence quoteContent = quoteList.get(rdIndex).getQuoteContentVN();
                CharSequence authorName = quoteList.get(rdIndex).getQuoteAuthorName();
                remoteViews.setTextViewText(R.id.appwidget_TvQuoteContent, quoteContent);
                remoteViews.setTextViewText(R.id.appwidget_textAuthorName, authorName);
            } else {
                remoteViews.setTextViewText(R.id.appwidget_TvQuoteContent, context.getString(R.string.not_quote_save));
                remoteViews.setTextViewText(R.id.appwidget_textAuthorName, context.getString(R.string.app_name));
            }

            Intent refresh = new Intent(context, NewAppWidget.class);
            refresh.setAction("android.appwidget.action.APPWIDGET_UPDATE");
            refresh.putExtra("appWidgetIds", appWidgetIds);
            PendingIntent pendingIntentRefresh = PendingIntent.getBroadcast(context, 0, refresh, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.widgetBtnReload, pendingIntentRefresh);
            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }
    }


    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
    }

    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }
}
公共类NewAppWidget扩展了AppWidgetProvider{
@凌驾
公共void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int[]AppWidgetId){
for(int-appWidgetId:appWidgetId){
RemoteViews RemoteViews=新远程视图(context.getPackageName(),R.layout.new\u app\u小部件);
DatabaseQuoteHelper DatabaseQuoteHelper=DatabaseQuoteHelper.newInstance(上下文);
List quoteList=databaseQuoteHelper.getAllQuotes();
如果(!quoteList.isEmpty()){
随机=新随机();
int rdIndex=random.nextInt(quoteList.size()-1);
CharSequence quoteContent=quoteList.get(rdIndex.getQuoteContentVN();
CharSequence authorName=quoteList.get(rdIndex.getQuoteAuthorName();
setextviewtext(R.id.appwidget_TvQuoteContent,quoteContent);
setTextViewText(R.id.appwidget_textAuthorName,authorName);
}否则{
setextviewtext(R.id.appwidget_TvQuoteContent,context.getString(R.string.not_quote_save));
setextviewtext(R.id.appwidget_textAuthorName,context.getString(R.string.app_name));