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