GVKun编程网logo

如何在Android 8.0中正确更新小部件 – Oreo – API 26(android 8.1 oreo)

7

本文将为您提供关于如何在Android8.0中正确更新小部件–Oreo–API26的详细介绍,我们还将为您解释android8.1oreo的相关知识,同时,我们还将为您提供关于android–AppW

本文将为您提供关于如何在Android 8.0中正确更新小部件 – Oreo – API 26的详细介绍,我们还将为您解释android 8.1 oreo的相关知识,同时,我们还将为您提供关于android – AppWidgetHost不更新小部件、android – Firestore – 如何在模型类中正确存储文档ID?、android – 使用AlarmManager手动更新小部件、android – 在App小部件上聆听手势的实用信息。

本文目录一览:

如何在Android 8.0中正确更新小部件 – Oreo – API 26(android 8.1 oreo)

如何在Android 8.0中正确更新小部件 – Oreo – API 26(android 8.1 oreo)

假设我有一个将targetSDKVersion设置为26的应用程序的小部件.此小部件需要100毫秒到10秒才能更新.大部分时间都在1s以下.在Android O之前,如果在我的appwidgetprovider上调用了onUpdate(),我可以启动后台服务来更新这个小部件.但是,如果您尝试该行为,Android O将返回IllegalStateException.启动前台服务的显而易见的解决方案似乎是一种极端的措施,可以在99%的时间内在10秒以内完成.

可能的解决方案

>启动前台服务以更新窗口小部件.用户通知会在10s内消失.
>使用JobScheduler尽快安排作业.您的小部件可能会或可能不会更新一段时间.
>尝试在广播接收器中完成工作.锁定任何其他应用程序的UI线程.呸.
>尝试在小部件接收器中工作.锁定任何其他应用程序的UI线程.呸.
>滥用GCM以运行后台服务.很多工作和感觉hacky.

我个人并不喜欢上述任何一种解决方案.希望我错过了一些东西.

(更令人沮丧的是,我的应用程序已经被系统调用onUpdate()加载到内存中.我没有看到如何将我的应用程序加载到内存中以调用onUpdate(),但后来没有给我的应用程序1s更新小部件UI线程正在为任何人节省电池寿命.)

解决方法:

您没有指出更新触发机制是什么.您似乎担心延迟(“您的小部件可能会或可能不会在一段时间内更新”),因此我将假设您的关注与用户与应用小部件的交互相关联,例如点击按钮.

Use JobScheduler to schedule a job as quickly as possible. Your widget may or may not get updated for a while.

这是“使用JobIntentService”的变体,AFAIK是此类场景的推荐解决方案.

其他选择包括:

>将getForegroundService()与PendingIntent一起使用.有了这个,你有效地“小发誓”你的服务将在ANR时间范围内调用startForeground().如果工作时间超过几秒钟,请调用startForeground()以确保Android不会变得暴躁.这应该最小化前景通知出现的时间.而且,如果用户点击了一个按钮并且您在几秒钟后仍然忙于工作,您可能希望显示通知或以其他方式做某事让用户知道他们要求的内容仍在进行中.
>在broadcastReceiver上使用goAsync(),在不占用主应用程序线程的情况下在接收器的上下文中工作.我没有尝试使用Android 8.0,所以YMMV.

android – AppWidgetHost不更新小部件

android – AppWidgetHost不更新小部件

我可以在片段中使用AppWidgetHost吗?我无法将大多数小部件添加到我的AppWidgetHost中进行更新.这是我的情景..

LauncherActivity.java

>非常简单,只需使用布局调用setContentView.

main.xml中

>包含一些片段,包括其中包含AppWidgetHost的片段.

CodeRedWidgetHostFragment.java

> onCreateView
创建AppWidgetHost&的实例AppWidgetManager
使用我存储在首选项中的窗口小部件ID创建和设置主机视图
> onStart()
appWidgetHost.startListening()
> onStop()
appWidgetHost.stopListening()

当我得到AppWidgetHost和AppWidgetManager的实例时,我正在使用getActivity()来获取Fragments托管活动.我想知道这是不是我的小部件没有更新的原因?

有些小部件实际上会更新,例如模拟时钟,但是,Youtube小部件不会自动循环显示视频缩略图.

我应该提一下,我在AppWidgetHost中选择了我想要的小部件,在另一个活动中将所选小部件的id存储在SharedPreferences中.

这是我的Fragment类的代码.

package com.brockoli.android.codered.widgethost;

import android.app.Fragment;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.appwidgetproviderInfo;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.brockoli.android.codered.R;

public class CodeRedWidgetHostFragment extends Fragment {
private static final String TAG = CodeRedWidgetHostFragment.class.getSimpleName();

public static final String CODERED_WIDGET_ID = "CODERED_WIDGET_ID";

private SharedPreferences mSharedPrefsWidgets;

AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    View parentView = inflater.inflate(R.layout.widget_host,null);

    mSharedPrefsWidgets = getActivity().getSharedPreferences("codered_widgets",0);

    mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
    mAppWidgetHost = new AppWidgetHost(getActivity(),R.id.APPWIDGET_HOST_ID);

    createWidget(parentView);

    return parentView;
}

@Override
public void onStart() {
    super.onStart();
    mAppWidgetHost.startListening();
}

@Override
public void onStop() {
    super.onStop();
    mAppWidgetHost.stopListening();
}


@Override
public void onResume() {
    super.onResume();
    createWidget(getView());
}

/**
 * Creates the widget and adds to our view layout.
 */
public void createWidget(View v) {
    if (v != null) {
        // Remove any existing widgets from the widget host
        ((ViewGroup) v).removeAllViews();
        int appWidgetId = mSharedPrefsWidgets.getInt(CODERED_WIDGET_ID,-1);
        if (appWidgetId > -1) {
            appwidgetproviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
            AppWidgetHostView hostView = mAppWidgetHost.createView(getActivity(),appWidgetId,appWidgetInfo);
            hostView.setAppWidget(appWidgetId,appWidgetInfo);
            ((ViewGroup) v).addView(hostView);
            Log.i(TAG,"The widget size is: " + appWidgetInfo.minWidth + "*" + appWidgetInfo.minHeight);
        }   
    }
}
}

解决方法

基于Clemens的回答,AppWidgetHost应该在应用程序的整个生命周期中保持活跃状态​​.这意味着无论Activity如何,您都应该可以轻松访问应用程序的AppWidgetHost和AppWidgetManager实例.
public class YourApp extends Application {

    private static final int HARDCODED_ID = 0; 

    private static AppWidgetHost appWidgetHost;
    private static AppWidgetManager appWidgetManager;

    @Override
    public void onCreate() {
        super.onCreate();

        appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
        appWidgetHost = new AppWidgetHost(getApplicationContext(),HARDCODED_ID);
        appWidgetHost.startListening();
    }

    @Override
    public void onTerminate() {
        super.onTerminate();

        appWidgetHost.stopListening();
        appWidgetHost = null;
    }

    public static AppWidgetHost getAppWidgetHost() { return appWidgetHost; }

    public static AppWidgetManager getAppWidgetManager() { return appWidgetManager; }

}

我当前的实现已正确更新.测试了许多需要“实时”更新的应用,例如我的音乐播放器小部件.

请记住,应用程序上下文用于确保AppWidgetHost和AppWidgetManager的上下文始终可用.

此外,在其小部件中使用AppCompat库的较新小部件目前在com.android.support:appcompat-v7:23.1.1依赖项中存在错误.为避免这种情况,请在调用以下内容时使用应用程

AppWidgetHostView hostView = YourApp.getAppWidgetHost()
            .createView(context.getApplicationContexxt(),info);

android – Firestore – 如何在模型类中正确存储文档ID?

android – Firestore – 如何在模型类中正确存储文档ID?

没有关于如何在自定义Java对象中正确存储Firestore文档的自动生成ID的真实文档.检索ID很简单,但如何正确存储以避免冗余.

这是我的方法:

型号类:

public class Note {
    private String documentId;
    private String title;
    private String description;

    public Note() {
        //public no arg constructor necessary
    }

    public Note(String title, String description) {
        this.title = title;
        this.description = description;
    }

    @Exclude
    public String getDocumentId() {
        return documentId;
    }

    public void setDocumentId(String documentId) {
        this.documentId = documentId;
    }

    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }
}

加载数据:

public void loadNotes(View v) {
    notebookRef.get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    List<Note> noteList = new ArrayList<>();

                    for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                        Note note = documentSnapshot.toObject(Note.class);
                        note.setDocumentId(documentSnapshot.getId());
                        noteList.add(note);
                    }
                }
            });
}

我的问题:

1)getter方法上的@Exclude是否足够?我还应该将它添加到setter吗?或者到现场申报?

2)我是否错过了更方便的方法来处理模型类中的文档ID?

解决方法:

吸气剂上的@Exclude就足够了.

没有一种“正确”的方式来做你正在做的事情.看起来你正在以你需要的方式处理它,这很好.

如果您希望看到一种更加形式化和自动化的方式将文档ID映射到javabean,这听起来像是您可以提交的feature request.也许可以添加另一个注释,指示您要用于存储ID的字段.

android – 使用AlarmManager手动更新小部件

android – 使用AlarmManager手动更新小部件

如 Android Dev Guide中所述,如果您希望窗口小部件更频繁地更新,则应使用AlarmManager设置不唤醒设备的警报.

原则上:不要使用appwidgetprovider类提供的标准机制,并且在xml文件中使用android:updatePeriodMillis轻松设置.

我很遗憾地问,但是指南只是声明“使用AlarmManager,使用RTC或ELAPSED_REALTIME,……”但是我如何发送一个意图来更新我的小部件!

任何人都可以说出我需要的代码来形成模仿默认行为的PendingIntent吗?我不知道如何获取小部件ID,我应该使用哪个动作等等…悲伤的开发指南在那时停止解释!
需要什么作为额外的行动?

如果有人感兴趣我为什么要更频繁地更新30分钟:我的小部件显示下一班车何时从车站出发.每20分钟就有一辆公共汽车,所以我有两个选择:每分钟更新一次小部件,显示下一班车的出发时间(这就是我想要的!!),或者不是那么好,说明下一班车的出发时间所以我必须至少每20分钟更新一次!

现在:当设备处于睡眠状态时,当然,这应该永远不会唤醒它 – 所以我在开发指南中对这一部分的理解是,这是实现它的正确方法;谁觉得我错了?
哦,另外我想知道的是:如果设备在应该更新小部件时处于睡眠状态并且由于睡眠设备而未发出警报,则它会在醒来时立即更新吗?

谢谢你的帮助!!

PS:我真的很想知道为什么窗口小部件提供程序的xml定义不允许通过布尔开关简单地声明“不要唤醒设备”……这将使生活变得如此简单!什么样的小部件需要唤醒设备无论如何???

总结

以上是小编为你收集整理的android – 使用AlarmManager手动更新小部件全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

android – 在App小部件上聆听手势

android – 在App小部件上聆听手势

我在Android中创建了一个应用程序小部件,并希望为其添加一些基于手势的功能.例如:当用户滑动时,显示新的数据集.
AppWidgets不支持AFAIK手势,但我看到了具有类似功能的小部件(例如HTC小部件相册和天气小部件).

请帮助我,让我知道我是否遗漏了什么.

欢迎链接到教程,文档或示例代码.

谢谢.

最佳答案
你不能回应app小部件中的手势,抱歉.目前支持的唯一交互是简单的点击事件.

关于如何在Android 8.0中正确更新小部件 – Oreo – API 26android 8.1 oreo的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – AppWidgetHost不更新小部件、android – Firestore – 如何在模型类中正确存储文档ID?、android – 使用AlarmManager手动更新小部件、android – 在App小部件上聆听手势等相关内容,可以在本站寻找。

本文标签: