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: Intent?, flags: Int, startId: Int)中做一些需要的耗時操作。
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分鐘更新一次
最後,設定remoteviews
1、建立自己的remoteviews繼承remoteviews
在init中設定基礎的點選事件
如果涉及到通過點選事件開啟service的話,可以這麼設定
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是為了區分點選事件設定的,不需要可以不設定。
相關文章
- 把你的程式放到桌面——Android桌面部件WidgetAndroid
- Android開發筆記[17]-桌面小部件Android筆記
- win10桌面小外掛如何設定_win10桌面小外掛怎麼新增Win10
- win10 怎麼設定小圖示_win10如何設定桌面圖示大小Win10
- 設定桌面GNOME或者KDE
- QT中 視窗部件的 背景圖片 的設定QT
- win10桌面圖示縮小如何設定 window10怎麼縮小桌面圖示Win10
- 直播小程式原始碼,Android 傾斜文字 效果設定原始碼Android
- C# 設定桌面動態桌布C#
- win10如何設定桌面顯示圖示_windows10顯示桌面圖示設定方法Win10Windows
- 如何在Mac桌面設定快捷方式?Mac
- 小白必看,初始Mac桌面這樣設定Mac
- 怎麼設定MacOS的多工桌面Mac
- win7下遠端桌面設定Win7
- win10桌面分類框怎麼設定?win10系統桌面分類框設定教程Win10
- win10桌面動態桌布怎麼設定 兩種方法教你設定win10動態桌面Win10
- [Android] EditText設定只能輸入2位小數的探討Android
- win10系統如何設定桌面透明Win10
- 【Mac新手必看】蘋果macOS桌面桌布設定技巧Mac蘋果
- Mac電腦如何設定一鍵回到桌面?Mac
- opensuse12.3 桌面設定備忘錄
- qt設定視窗在桌面居中顯示QT
- Android WebView ScrollBar設定AndroidWebView
- android 設定listview高度AndroidView
- win10 如何設定桌面背景自動切換_win10系統怎麼設定桌面切換Win10
- pandas引數設定小技巧
- 微信小程式設定背景圖微信小程式
- MATLAB 設定小的tickMatlab
- CSS樣式設定小技巧CSS
- win10系統桌面桌布怎麼設定Win10
- WindowsServer2012桌面圖示設定WindowsServer
- 將HTML文件設定為Windows桌面背景(轉)HTMLWindows
- win10怎麼設定桌面桌布_window10桌面桌布怎麼換Win10
- windows10 桌面圖示在哪裡_win10如何設定桌面圖示WindowsWin10
- Win7在桌面上設定一鍵鎖定按鈕Win7
- Android之Service設定android:process作用Android
- Android屬性設定android:noHistory="true"Android
- SAP BSP, Java Web Project,Android和微信小程式的初始頁面設定JavaWebProjectAndroid微信小程式