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)
还没有任何评论哟~
