Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AppWidgetHost上的AppWidgets在重新启动后消失_Java_Android_Android Source_Android Appwidget - Fatal编程技术网

Java AppWidgetHost上的AppWidgets在重新启动后消失

Java AppWidgetHost上的AppWidgets在重新启动后消失,java,android,android-source,android-appwidget,Java,Android,Android Source,Android Appwidget,现在这是一种使用AppWidgets的非传统方法。我在AOSP的系统级工作。基本上,AppWidgets有一个自定义的widget类别,我通过轮询来获取提供者和我需要的一切。现在的问题有两个:1.)AppWidget没有像应该的那样更新;2.)它们在重新启动后消失,不再显示在小部件列表中。当我将类别设置为launcher小部件时也会发生这种情况(当服务未运行时,launcher小部件会按预期工作)。我可以在可能的情况下提供日志和堆栈跟踪,并尽一切努力帮助解决这个问题。我要用这个把我的头发扯下来。

现在这是一种使用AppWidgets的非传统方法。我在AOSP的系统级工作。基本上,AppWidgets有一个自定义的widget类别,我通过轮询来获取提供者和我需要的一切。现在的问题有两个:1.)AppWidget没有像应该的那样更新;2.)它们在重新启动后消失,不再显示在小部件列表中。当我将类别设置为launcher小部件时也会发生这种情况(当服务未运行时,launcher小部件会按预期工作)。我可以在可能的情况下提供日志和堆栈跟踪,并尽一切努力帮助解决这个问题。我要用这个把我的头发扯下来。AppWidgetHost的代码如下所示

注: -我不能使用设置意图来选择AppWidget,因为我需要一个自定义选择器

public class SecondScreenService extends Service {

private ArrayList<View> ssas = new ArrayList<>();
private ArrayList<Integer> appWidgetIds = new ArrayList<>();
private ArrayList<AppWidgetProviderInfo> secondScreenWidgets = new ArrayList<>();
private FrameLayout fakeRootView;
private SecondScreenView rootView;
private ViewsPagerAdapter viewsPagerAdapter;
private ViewPager viewPager;
private WindowManager wm;
private DisplayManager dm;
private LayoutInflater inflater;
private AppWidgetManager mAppWidgetManager;
private AppWidgetHost mAppWidgetHost;
private BroadcastReceiver mReceiver = new PackageReceiver();
private ArrayList<Integer> pos = new ArrayList<>();
private int scrollState;
public static final int APPWIDGET_HOST_ID = 3254;
public static final String TAG = "BLUG";

private final IBinder mBinder = (IBinder) new LocalBinder();                                                                                              

public class LocalBinder extends Binder {                                                                                                                
    public SecondScreenService getService() {                                                                                                            
        return SecondScreenService.this;                                                                                                                  
    }                                                                                                                                                    
}                                                                                                                                                        

@Override                                                                                                                                                
public IBinder onBind(Intent intent) {                                                                                                                    
    return mBinder;                                                                                                                                      
}                                                                                                                                                        

@Override                                                                                                                                                
public void onCreate() {                                                                                                                                  
    inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);

    fakeRootView = (FrameLayout) inflater.inflate(R.layout.second_screen_root, null);

    rootView = (SecondScreenView) fakeRootView.findViewById(R.id.secondscreenview);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.OPAQUE);

    params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SECOND_SCREEN;
    params.gravity = Gravity.LEFT | Gravity.TOP;
    params.x = 400;
    params.y = 0;
    params.width = 1040;
    params.height = 160;

    wm.addView(fakeRootView, params);

    viewPager = (ViewPager) fakeRootView.findViewById(R.id.second_screen_viewpager);
    viewsPagerAdapter = new ViewsPagerAdapter(this);
    viewPager.setAdapter(viewsPagerAdapter);

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
    intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
    intentFilter.addDataScheme("package");

    registerReceiver(mReceiver, intentFilter);
    mAppWidgetManager = AppWidgetManager.getInstance(this);
    mAppWidgetHost = new AppWidgetHost(this, SecondScreenService.APPWIDGET_HOST_ID);
    mAppWidgetHost.startListening();
    pollWidgets();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mAppWidgetHost.stopListening();
    if (fakeRootView != null) {
        wm.removeView(fakeRootView);
        fakeRootView = null;
    }
}

private void pollWidgets() {
    for(View view : ssas) {
        mAppWidgetHost.deleteAppWidgetId(((AppWidgetHostView) view).getAppWidgetId());
    }
    ssas.clear();
    int appWidgetId = this.mAppWidgetHost.allocateAppWidgetId();
    List<AppWidgetProviderInfo> widgets = new ArrayList<>();
    mAppWidgetManager.getInstalledProviders(AppWidgetProviderInfo.WIDGET_CATEGORY_SECOND_SCREEN);
    widgets.addAll(mAppWidgetManager.getInstalledProviders(36864));
    for(AppWidgetProviderInfo awpi : widgets) {
        System.out.println("BLUG: SysUI: got widget " + awpi.provider.toString());
        mAppWidgetManager.bindAppWidgetId(appWidgetId, awpi.provider);
        AppWidgetHostView hostView = mAppWidgetHost.createView(this, appWidgetId, awpi);
        hostView.setAppWidget(appWidgetId, awpi);
        ssas.add((View) hostView);
    }
    if(this.viewPager != null && this.viewsPagerAdapter != null) {
        viewsPagerAdapter = new ViewsPagerAdapter(this);
        viewPager.setAdapter(viewsPagerAdapter);
    }
}

private class PackageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                SecondScreenService.this.pollWidgets();
            }
        }, 1000);
    }
}

private class ViewsPagerAdapter extends PagerAdapter {
    private Context mContext;

    public ViewsPagerAdapter(Context context) {
        mContext = context;
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        View view = (View) SecondScreenService.this.ssas.get(position);
        collection.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        collection.removeView((View) view);
    }

    @Override
    public int getCount() {
        return SecondScreenService.this.ssas.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "";
    }
}
}
公共类SecondScreenService扩展服务{
private ArrayList ssas=new ArrayList();
private ArrayList appWidgetIds=new ArrayList();
私有ArrayList secondScreenWidgets=新ArrayList();
私人框架布局假货;
私有SecondScreenView根视图;
私人视图SPAGERADAPTER ViewsPagerAdapter;
私人视页机视页机;
私有窗口管理器;
私有显示管理器;
私人充气机;
私有AppWidgetManager mAppWidgetManager;
私有AppWidgetHost mAppWidgetHost;
private BroadcastReceiver mReceiver=新的PackageReceiver();
private ArrayList pos=new ArrayList();
私有国家;
公共静态最终int-APPWIDGET_-HOST_-ID=3254;
公共静态最终字符串TAG=“BLUG”;
私有最终IBinder mBinder=(IBinder)新本地绑定器();
公共类LocalBinder扩展了Binder{
public SecondScreenService getService(){
返回SecondScreenService.this;
}                                                                                                                                                    
}                                                                                                                                                        
@凌驾
公共IBinder onBind(意图){
返回mBinder;
}                                                                                                                                                        
@凌驾
public void onCreate(){
充气器=(LayoutFlater)this.getSystemService(Context.LAYOUT\u充气器\u服务);
wm=(WindowManager)this.getSystemService(Context.WINDOW\u服务);
fakeRootView=(FrameLayout)充气器。充气(R.layout.second\u screen\u root,null);
rootView=(SecondScreenView)fakeRootView.findViewById(R.id.SecondScreenView);
WindowManager.LayoutParams params=新建WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH\u父级,
WindowManager.LayoutParams.MATCH\u父级,
WindowManager.LayoutParams.TYPE\u系统错误,
WindowManager.LayoutParams.FLAG\u不可聚焦|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_model|
WindowManager.LayoutParams.FLAG_布局在屏幕中,
像素格式(不透明);
params.privateFlags |=WindowManager.LayoutParams.PRIVATE_标志第二个屏幕;
params.gravity=gravity.LEFT | gravity.TOP;
参数x=400;
参数y=0;
参数宽度=1040;
参数高度=160;
wm.addView(fakeRootView,参数);
viewPager=(viewPager)fakeRootView.findViewById(R.id.second\u screen\u viewPager);
viewsPagerAdapter=新viewsPagerAdapter(此);
设置适配器(viewsPagerAdapter);
IntentFilter IntentFilter=新的IntentFilter();
intentFilter.addAction(添加了Intent.ACTION\u包);
intentFilter.addAction(Intent.ACTION\u包\u已删除);
intentFilter.addAction(Intent.ACTION\u包\u被替换);
intentFilter.addDataScheme(“包”);
注册接收者(mReceiver,intentFilter);
mAppWidgetManager=AppWidgetManager.getInstance(此);
mAppWidgetHost=新的AppWidgetHost(这是SecondScreenService.APPWIDGET\u主机\u ID);
mAppWidgetHost.startListening();
pollWidgets();
}
@凌驾
公共空间{
super.ondestory();
mAppWidgetHost.stopListening();
if(fakeRootView!=null){
wm.removeView(fakeRootView);
fakeRootView=null;
}
}
私有void pollWidgets(){
用于(视图:ssas){
mAppWidgetHost.deleteAppWidgetId(((AppWidgetHostView)视图).getAppWidgetId();
}
ssas.clear();
int-appWidgetId=this.mAppWidgetHost.allocateAppWidgetId();
List widgets=new ArrayList();
mAppWidgetManager.getInstalledProviders(AppWidgetProviderInfo.WIDGET\u类别\u第二屏幕);
addAll(MappWidgetGetManager.getInstalledProviders(36864));
用于(AppWidgetProviderInfo awpi:widgets){
System.out.println(“BLUG:SysUI:get小部件”+awpi.provider.toString());
mAppWidgetManager.bindAppWidgetId(appWidgetId,aw