huawei--创建job,判断是否已经存在

本文介绍了一个使用Oracle DBMS_JOB包实现的定时任务调度程序。该程序首先检查是否存在名为'spOprScoreDaily'的任务,如果存在则删除原有任务。接着设定新的任务执行时间和周期,并提交任务。另外还展示了一个立即执行的任务示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE OR REPLACE PROCEDURE spQcJob
AS
  v_jobname NUMBER;
  v_date DATE;
  v_Count int;
BEGIN

  select count(*) into v_Count from dba_jobs where what='spOprScoreDaily;';
  IF v_Count>0 THEN
  select job into v_jobname from dba_jobs where what='spOprScoreDaily;';
  sys.DBMS_JOB.REMOVE(v_jobname);
  END IF;
  v_date := TRUNC(SYSDATE+1,'DD')+6/24;
  sys.DBMS_JOB.SUBMIT(v_jobname,'spOprScoreDaily;',v_date,'TRUNC(SYSDATE+1,''DD'')+6/24');
  COMMIT;
END spQcJob;
/
EXECUTE spQcJob;
/
DECLARE
  v_Job NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(v_Job, 'p_maintendata;', TRUNC(SYSDATE), 'SYSDATE + 1');
  COMMIT;
END;
/

<think>嗯,用户之前问过怎么用Kotlin写安卓系统消息推送的代码,现在又想知道如何通过创建进程实现后台消息推送。我需要先理解他到底想要什么。可能用户觉得之前的FCM方案在国内可能不太行,或者想更深入地控制后台推送机制,比如通过创建进程来保持应用活跃。不过,安卓的后台处理有很多限制,特别是从Android 8.0(API 26)之后,后台服务被严格限制,不能随意创建长时间运行的进程。 首先,得考虑用户的实际需求。他们可能希望应用在后台持续运行,及时接收消息,但安卓系统为了省电和性能,不允许应用长时间在后台运行。所以直接创建进程可能不是最佳做法,反而可能导致应用被系统杀死或者消耗过多资源,影响用户体验。 接下来,我需要回顾之前提供的FCM方案,指出其局限性,尤其是在国内无法使用的情况。这时候可能需要推荐使用厂商推送服务,比如华为、小米、OPPO等的推送SDK,因为这些服务在国内有更好的兼容性和稳定性。另外,可以考虑使用WorkManager或者AlarmManager来定期检查消息,但这可能会延迟推送的实时性。 用户提到“创建进程”,可能是指通过Service或者WorkManager来维持后台任务。但需要解释安卓的后台限制,比如后台执行限制、应用待机模式等,这些都会影响进程的存活时间。所以直接创建独立进程可能不可行,需要采用系统推荐的方法。 另外,需要注意用户可能存在的误区,认为创建进程可以保证推送实时性,但实际上这样做会违反安卓的最佳实践,导致应用被系统限制甚至下架。应该引导用户使用合法的推送方案,比如结合前台服务(需要通知用户)或者使用JobScheduler、WorkManager等系统调度任务。 最后,总结推荐方案,强调使用厂商推送服务和系统推荐的后台处理机制,而不是自行创建进程。同时提醒用户需要处理不同安卓版本的权限和限制,确保应用的合规性和稳定性。</think>在Android系统中实现后台消息推送的正确方法需要遵循系统规范,以下是最新Android版本(API 31+)推荐的实现方案: ### 一、现代Android后台机制核心原则 1. **进程限制**:自Android 8.0起禁止后台服务常驻 2. **省电优化**:后台应用有严格的CPU/网络使用限制 3. **推荐方案**:使用WorkManager + 厂商推送服务混合模式 ### 二、推荐技术实现方案 ```kotlin // 消息接收统一入口(使用WorkManager) class PushWorker( context: Context, workerParams: WorkerParameters ) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { return try { // 执行消息拉取(示例使用Retrofit) val response = PushClient.getMessages() if (response.isSuccessful) { showNotification(response.body()!!) Result.success() } else { Result.retry() } } catch (e: Exception) { Result.failure() } } private fun showNotification(msg: PushMessage) { // 创建通知渠道(Android 8.0+必需) createNotificationChannel() val notification = NotificationCompat.Builder(applicationContext, CHANNEL_ID) .setSmallIcon(R.drawable.ic_push) .setContentTitle(msg.title) .setContentText(msg.content) .setPriority(NotificationCompat.PRIORITY_HIGH) .build() NotificationManagerCompat.from(applicationContext) .notify(Random.nextInt(), notification) } } // 初始化定期任务(在Application类中) class MyApp : Application() { override fun onCreate() { super.onCreate() setupPeriodicPushCheck() } private fun setupPeriodicPushCheck() { val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() val request = PeriodicWorkRequestBuilder<PushWorker>( 15, TimeUnit.MINUTES // 最小间隔15分钟 ).setConstraints(constraints) .build() WorkManager.getInstance(this) .enqueueUniquePeriodicWork( "push_worker", ExistingPeriodicWorkPolicy.KEEP, request ) } } ``` ### 三、厂商级推送集成(关键步骤) 1. **判断设备厂商**: ```kotlin fun getPushType(): PushVendor { return when { Build.MANUFACTURER.equals("huawei", ignoreCase = true) -> PushVendor.HMS Build.MANUFACTURER.equals("xiaomi", ignoreCase = true) -> PushVendor.MIPUSH else -> PushVendor.FCM // 其他设备使用Firebase } } ``` 2. **统一消息接口**: ```kotlin interface UnifiedPushClient { fun register() fun unregister() fun getToken(): String } // 华为推送实现示例 class HuaweiPushClient(context: Context) : UnifiedPushClient { private val hmsInstance = HmsInstanceId.getInstance(context) override fun register() { AsyncTask.execute { val token = hmsInstance.getToken("your_app_id", "HCM") // 发送token到服务器 } } } ``` ### 四、后台存活优化策略 1. **前台服务**(需显示通知): ```kotlin class PushForegroundService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val notification = buildNotification() startForeground(NOTIFICATION_ID, notification) return START_STICKY } private fun buildNotification(): Notification { // 创建前台服务通知(必须包含关闭渠道) } } ``` 2. **进程唤醒策略**: ```xml <!-- AndroidManifest.xml配置 --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> ``` ### 五、适配注意事项 1. **Android 12+ 限制**: - 必须声明前台服务类型:`android:foregroundServiceType="remoteMessaging"` - 精确的闹钟权限需要单独申请 2. **Android 13+ 要求**: - 必须动态申请通知权限: ```kotlin val requestPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted -> /* 处理结果 */ } if (Build.VERSION.SDK_INT >= 33) { requestPermissionLauncher.laish(Manifest.permission.POST_NOTIFICATIONS) } ``` ### 六、最佳实践建议 1. 优先使用厂商推送服务(华为HMS/小米推送等) 2. 国内环境推荐集成第三方推送SDK(如个推、极光) 3. 定期任务间隔不要短于15分钟 4. 前台服务必须提供可关闭的通知 5. 使用`PowerManager.isIgnoringBatteryOptimizations()`检查电量优化状态 注意:Google Play政策明确禁止滥用后台进程,开发者应使用WorkManager等官方推荐方案。长期驻留进程可能导致应用被系统强制停止或商店下架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值