【问题标题】:Android Widget lose pending intentAndroid Widget 失去待处理的意图
【发布时间】:2013-04-30 13:41:34
【问题描述】:

我是 Android 新手,有点问题,我已经搜索了多个论坛,但一无所获..

我有一个显示电池的简单小部件,点击它会打开一个带有弹出主题的活动。

所以我也有这个文件,可能是某些方法错误?

小部件提供者:

public class Widget extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);
        context.startService(new Intent(context, Service.class));
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        ComponentName thisWidget = new ComponentName(context,
                Widget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);

        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        for (int widgetId : allWidgetIds) {

            RemoteViews updateViews = new RemoteViews(context.getPackageName(),
                    R.layout.widget_layout);

            Intent intent = new Intent(context, Popup.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                    intent, 0);
            updateViews.setOnClickPendingIntent(R.id.widget_layout,
                    pendingIntent);

            manager.updateAppWidget(widgetId, updateViews);

        }
    }

    @Override
    public void onDisabled(Context context) {
        // TODO Auto-generated method stub
        context.stopService(new Intent(context, Service.class));
        super.onDisabled(context);
    }
}

为我服务:

public class Service extends Service {

    private int batteryLevel = 0;
    RemoteViews updateViews;

    private BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                batteryLevel = intent.getIntExtra("level", 0);
                updateViews = new RemoteViews(context.getPackageName(),
                        R.layout.widget_layout);

                updateViews.setImageViewBitmap(R.id.imgBattery,
                buildBitmap(batteryLevel + "%", context));

                ComponentName thisWidget = new ComponentName(context,
                        Widget.class);
                AppWidgetManager manager = AppWidgetManager
                        .getInstance(context);
                manager.updateAppWidget(thisWidget, updateViews);
            }
        }
    };

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(receiver, intentFilter);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        unregisterReceiver(Receiver);
        super.onDestroy();
    }
}

有人可以帮帮我吗?除此之外,该服务在运行时有 30MB...

【问题讨论】:

    标签: android service widget broadcastreceiver android-pendingintent


    【解决方案1】:

    让我们为您简化:

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                batteryLevel = intent.getIntExtra("level", 0);
                updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    
                updateViews.setImageViewBitmap(R.id.imgBattery, buildBitmap(batteryLevel + "%", context));
    
                Intent intent = new Intent(context, Popup.class);
                PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
                updateViews.setOnClickPendingIntent(R.id.widget_layout, pendingIntent);
    
                ComponentName thisWidget = new ComponentName(context, Widget.class);
                AppWidgetManager manager = AppWidgetManager.getInstance(context);
                manager.updateAppWidget(thisWidget, updateViews);
            }
        }
    };
    

    【讨论】:

    • 谢谢! 1. 我在 onUpdate(Widget 类)上删除了什么? 2. onEnabled 我已经通过启动服务了,可以吗?因为当我重新启动手机时,它只会更新电池更换..
    • 1.抱歉,我不明白您的第一个问题 2. onEnabled() 仅在第一次创建 App Widget 实例时调用。例如,如果用户添加了您的 App Widget 的两个实例,这只会在第一次调用。这就是重启后服务没有启动的原因。从 onUpdate() 或 onReceive() 启动服务,但确保它在应用程序的生命周期中只发生一次。使用例如一个静态布尔变量,用于检查它是否已经启动。
    • 1.我必须删除我的小部件类上的某些内容,因为我也打算提供服务?删除重复的代码? 2. 我用过这个例子stackoverflow.com/questions/600207/… where is not running 然后启动它,好主意吗?有什么好改进的?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多