Advertisement

android设置桌面小部件

阅读量:

1、简单的创建完成后:
在AppWidgetProvider内

复制代码
     override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        // There may be multiple widgets active, so update all of them
        for (appWidgetId in appWidgetIds) {
            onAppWidgetOptionsChanged(
                context,
                appWidgetManager,
                appWidgetId,
                appWidgetManager.getAppWidgetOptions(appWidgetId)
            )
        }
    }

该系统将按照预设配置文件执行定期任务;尽管如此,在最短的情况下间隔为15分钟,在常规情况下则是每隔30分钟执行一次。

复制代码
      /** * 桌面小部件添加时调用
     * @param context receiver is running
     */
    override fun onEnabled(context: Context) {
        startNotifyServiceOne()
        val componentName = ComponentName(context, WeatherOneWidget::class.java)
        val packageManager = context.packageManager
        val componentEnabledSetting = packageManager.getComponentEnabledSetting(componentName)
        if (componentEnabledSetting != PackageManager.COMPONENT_ENABLED_STATE_ENABLED && componentEnabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
            packageManager.setComponentEnabledSetting(
                componentName,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP
            )
        }
        MobclickAgent.onEvent(context, WIDGET_ADD,"主要显示天气---4x1")
    }

该方法在启动桌面组件时会被调用,在这里我们进行了必要的初始化步骤,并启用了相关服务以确保系统正常运行。

复制代码
     /** * 控件大小发生改变时调用
     * @param context receiver is running
     * @param appWidgetManager AppWidgetManager的对象,可以用这个调用updateAppWidget
     * @param appWidgetId 桌面小部件id,哪个桌面小部件大小发生了变化,这个就是哪个的id
     * @param newOptions 不知道
     */
    override fun onAppWidgetOptionsChanged(
        context: Context?,
        appWidgetManager: AppWidgetManager?,
        appWidgetId: Int,
        newOptions: Bundle?
    ) {
        startNotifyServiceOne()
    }

该方法在控件尺寸发生变动时会被触发,并且我们之前已经手动触发了该操作。为了更好地管理流程,我们现在启动相关服务以处理后续事务。具体而言, 我们可以按照以下步骤来启动该服务: 首先确认相关参数设置是否正确; 其次启动服务并进行必要的配置。

复制代码
    val intent = Intent(context, WeatherOneService::class.java)
    intent.setPackage(context.packageName)
    ContextCompat.startForegroundService(context, intent)

底下这个方法在service中onCreate中调用

复制代码
       private fun initForeground() {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                startForeground(1003, getNotification(this))
            }
        } catch (e: Throwable) {
            e.printStackTrace()
        }
    }

getNotification方法主要是做以下设置

复制代码
    private fun getNotification(context: Context): Notification {
        return NotificationCompat.Builder(context, "weather")
            .setSmallIcon(R.mipmap.app_launcher)
            .setContentTitle(context.getString(R.string.app_name))
            .setContentText(context.getString(R.string.slogan))
            .setContentIntent(getMainPendingIntent(context)).build()
    }
    
    private fun getMainPendingIntent(context: Context): PendingIntent {
        val intent = Intent()
        intent.setPackage(context.packageName)
        intent.component = ComponentName(context, ReMainActivity::class.java)
        intent.action = context.packageName + ".action.notify"
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.putExtra("isNeedCheckNotify", false)
        intent.putExtra("where", "notify")
        return PendingIntent.getActivity(context, 0, intent, 0)
    }

在调用onStartCommand函数(intent类型的参数?, 两个整型参数:flags和startId)时执行一些必要的耗时操作

复制代码
     clickCode = intent?.getIntExtra(REQUEST_CODE, 0) ?: 0
        timer?.cancel()
        timer = Timer()
        val handler = MyHandler(this)
        timer?.schedule(object : TimerTask() {
            override fun run() {
                handler.removeMessages(TIME_UPDATE)
                handler.sendEmptyMessageAtTime(TIME_UPDATE, 1000)
            }
        }, 0, 1000 * 60 * 10)//10分钟更新一次

最后一步是配置remotviews。步骤一:创建基于remotviews的自定义组件,在初始化阶段配置基本的点击事件处理逻辑。当需要通过点击事件启动服务时,请按照以下方法操作

复制代码
      private fun getSupportPending(context: Context, intent: Intent): PendingIntent {
        Intrinsics.checkParameterIsNotNull(context, com.umeng.analytics.pro.b.Q)
        Intrinsics.checkParameterIsNotNull(intent, "Intent")
        intent.setPackage(context.packageName)
        intent.putExtra(REQUEST_CODE,41)
        return when {
            SDK_INT >= Build.VERSION_CODES.P -> {
                intent.setClass(context, WidgetHotSpotActivity::class.java)
                PendingIntent.getActivity(context, 41, intent, PendingIntent.FLAG_UPDATE_CURRENT)
            }
            SDK_INT >= Build.VERSION_CODES.O -> {
                PendingIntent.getForegroundService(
                    context,
                    41,
                    intent,
                    PendingIntent.FLAG_UPDATE_CURRENT
                )
            }
            else -> {
                PendingIntent.getService(context, 41, intent, PendingIntent.FLAG_UPDATE_CURRENT)
            }
        }
    }

根据不同版本采用不同策略,在WidgetHotSpotActivity中采用如下配置方式:[...]

复制代码
    class WidgetHotSpotActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val intExtra = intent.getIntExtra(REQUEST_CODE, 0)
        startNotifyServiceOne(intExtra)
        finish()
    }
    }

requestcode是为了区分点击事件设置的,不需要可以不设置。

全部评论 (0)

还没有任何评论哟~