一次service不能正常启动的处理过程

部署运行你感兴趣的模型镜像
1,服务不能正常启动,显示数据库状态不正常
[grid@dtydb4 ~]$ srvctl start service -d epmdb -s srv_epm1 -i epmdb1
PRCR-1013 : Failed to start resource ora.epmdb.srv_epm1.svc
PRCR-1064 : Failed to start resource ora.epmdb.srv_epm1.svc on node dtydb3
CRS-2800: Cannot start resource 'ora.epmdb.db' as it is already in the INTERMEDIATE state on server 'dtydb3'


2,原因为数据库状态异常,Stuck Archiver

[grid@dtydb4 ~]$ crsctl status resource -t

ora.epmdb.db
1 ONLINE INTERMEDIATE dtydb3 Stuck Archiver
2 ONLINE ONLINE dtydb4 Open
3 ONLINE ONLINE dtydb5 Open

3,找到原因,解决问题。

根据意思查询应该是archive方面的原因,查询日志

ORA-19815: ???ˉ???|: db_recovery_file_dest_size ?—?–???? (?1?2 5218762752 ?—?–????) ?’?‘???1?“?? 100.00%,

由于是测试系统,调整该参数大小

sys@EPMDB1(10.4.124.233)> alter system set db_recovery_file_dest_size = 10G scope=both;

?μí3ò??ü???£


4,恢复正常,下一步要调整下测试库的某些参数


再次查看状态,恢复正常
[grid@dtydb4 ~]$ crsctl status resource -t
ora.epmdb.db
1 ONLINE ONLINE dtydb3 Open
2 ONLINE ONLINE dtydb4 Open
3 ONLINE ONLINE dtydb5 Open


再次启动服务,恢复正常
[oracle@dtydb3 trace]$ srvctl start service -d epmdb -s srv_epm1 -i epmdb1
PRCC-1014 : srv_epm1 was already running
PRCR-1004 : Resource ora.epmdb.srv_epm1.svc is already running

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think> 我们之前讨论的是在Android中通过Service设置壁纸而不使用Bitmap对象。现在用户的问题聚焦于“不通过启动Service手动点击,而是利用Service的壁纸直接进行切换的方法”。这里的“手动点击”可能指的是用户通过界面按钮启动Service来切换壁纸。而用户希望的是避免这种手动操作,实现自动切换。 结合上下文,用户可能希望: 1. 无需用户手动触发(如点击按钮),自动在后台切换壁纸。 2. 仍然使用Service来完成壁纸切换,但不显式创建Bitmap对象。 解决方案思路: 我们可以创建一个后台Service,该Service在合适的时机(例如定时)自动切换壁纸。这样,用户就不需要每次手动点击。具体实现可以采用以下步骤: 1. 创建一个继承自Service的类(如WallpaperAutoChangeService)。 2. 在该Service中,我们可以使用定时器(如AlarmManager、Handler、WorkManager等)来定时触发壁纸切换。 3. 在壁纸切换时,使用WallpaperManager的setResource()或setStream()方法(避免直接使用Bitmap)。 4. 注意:为了在后台运行,可能需要考虑后台执行限制(Android 8.0及以上版本对后台服务有限制,建议使用WorkManager或前台服务)。 然而,用户提到“不启动Service手动点击”,意味着用户不想通过界面按钮启动Service,而是希望Service能够自动运行。因此,我们可以考虑以下几种自动启动Service的方式: - 在设备启动启动Service(监听BOOT_COMPLETED广播),然后运行一个长期在后台的Service(注意:长期后台服务需要设置为前台服务,以避免被系统杀死)。 - 使用WorkManager安排定期任务,在任务中切换壁纸(此方式无需长期运行的服务,每次执行任务时切换壁纸)。 考虑到Android版本兼容性和后台限制,推荐使用WorkManager来安排定期壁纸切换任务。这样,我们可以避免手动点击,由系统在合适的时间触发壁纸切换。 具体步骤: 步骤1:添加依赖(build.gradle) 在app的build.gradle文件中添加WorkManager的依赖: ```groovy dependencies { def work_version = "2.7.0" implementation "androidx.work:work-runtime:$work_version" } ``` 步骤2:创建Worker类(执行壁纸切换任务) 定义一个继承自Worker的类,在doWork()方法中实现壁纸切换逻辑(使用setResource或setStream)。 步骤3:安排定期任务 在应用启动时(例如在Application类或主Activity中)安排一个周期性任务。 步骤4:处理设备重启(可选) 如果需要设备重启后仍然保持定时任务,可以监听BOOT_COMPLETED广播,重新安排任务。 代码示例: 1. 创建壁纸切换Worker(WallpaperChangeWorker.java): ```java import android.content.Context; import android.app.WallpaperManager; import androidx.annotation.NonNull; import androidx.work.Worker; import androidx.work.WorkerParameters; import java.io.IOException; public class WallpaperChangeWorker extends Worker { public WallpaperChangeWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @NonNull @Override public Result doWork() { // 切换壁纸,使用资源文件(示例:R.drawable.wallpaper1和wallpaper2交替) // 实际应用中,可以从资源数组或文件中按顺序选择 try { WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext()); // 模拟切换:假设有两个壁纸资源,每次轮流使用 int wallpaperRes = getApplicationContext().getSharedPreferences("wallpaper_prefs", Context.MODE_PRIVATE) .getInt("next_wallpaper", R.drawable.wallpaper1); wallpaperManager.setResource(wallpaperRes); // 更新下一次要使用的壁纸 int nextRes = (wallpaperRes == R.drawable.wallpaper1) ? R.drawable.wallpaper2 : R.drawable.wallpaper1; getApplicationContext().getSharedPreferences("wallpaper_prefs", Context.MODE_PRIVATE) .edit().putInt("next_wallpaper", nextRes).apply(); return Result.success(); } catch (IOException e) { e.printStackTrace(); return Result.failure(); } } } ``` 2. 安排周期性任务(例如在MainActivity.java中): ```java import androidx.appcompat.app.AppCompatActivity; import androidx.work.Constraints; import androidx.work.ExistingPeriodicWorkPolicy; import androidx.work.NetworkType; import androidx.work.PeriodicWorkRequest; import androidx.work.WorkManager; import android.os.Bundle; import java.util.concurrent.TimeUnit; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 安排一个每15分钟运行一次的壁纸切换任务(注意:最小周期为15分钟) PeriodicWorkRequest wallpaperWorkRequest = new PeriodicWorkRequest.Builder(WallpaperChangeWorker.class, 15, TimeUnit.MINUTES) .setConstraints(new Constraints.Builder() .setRequiredNetworkType(NetworkType.NOT_REQUIRED) // 不需要网络 .build()) .build(); WorkManager.getInstance(this).enqueueUniquePeriodicWork( "wallpaperChangeWork", ExistingPeriodicWorkPolicy.KEEP, // 如果已有同名任务,则保留现有的 wallpaperWorkRequest); } } ``` 3. 处理设备重启(可选):在设备重启后重新安排任务 首先,在AndroidManifest.xml中注册广播接收器并声明权限: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application ...> <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> ``` 然后,创建广播接收器(BootReceiver.java): ```java import android.content.Context; import android.content.Intent; import androidx.work.Constraints; import androidx.work.ExistingPeriodicWorkPolicy; import androidx.work.NetworkType; import androidx.work.PeriodicWorkRequest; import androidx.work.WorkManager; import android.content.BroadcastReceiver; import java.util.concurrent.TimeUnit; public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { // 设备重启后重新安排任务 PeriodicWorkRequest wallpaperWorkRequest = new PeriodicWorkRequest.Builder(WallpaperChangeWorker.class, 15, TimeUnit.MINUTES) .setConstraints(new Constraints.Builder() .setRequiredNetworkType(NetworkType.NOT_REQUIRED) .build()) .build(); WorkManager.getInstance(context).enqueueUniquePeriodicWork( "wallpaperChangeWork", ExistingPeriodicWorkPolicy.REPLACE, // 替换已有的 wallpaperWorkRequest); } } } ``` 注意事项: 1. 周期性任务的最小间隔是15分钟(由WorkManager限制)。 2. 使用WorkManager可以避免后台服务被系统限制的问题,且兼容性好。 3. 壁纸资源需要提前放置在drawable目录下,并按顺序切换。 通过上述方法,我们实现了不通过手动点击,自动定时切换壁纸的功能,且整个过程没有直接操作Bitmap对象。 引用说明: - 我们使用了WorkManager来安排后台任务,这符合最新的Android后台任务处理推荐方式[^3]。 - 在壁纸切换时使用的是WallpaperManager的setResource方法,避免了直接操作Bitmap对象[^1]。 相关问题: 1. 如何动态改变壁纸切换的时间间隔? 2. 如何从网络下载壁纸并自动设置(不使用Bitmap对象)? 3. 在Android 10及以上版本中,使用WorkManager设置壁纸时需要注意哪些权限问题? </think> ### 通过Service实现壁纸自动切换的方案 #### 核心思路 通过Service实现壁纸自动切换的关键是: 1. **创建后台服务**:使用绑定式服务(`bindService`)建立Activity与Service的持久连接 2. **定时切换机制**:在Service内部实现定时触发壁纸切换逻辑 3. **壁纸资源管理**:通过`WallpaperManager.setResource()`直接设置资源文件,避免Bitmap操作 4. **生命周期控制**:合理处理Service绑定和解绑流程 #### 实现步骤 以下是完整的实现代码(以每30分钟自动切换壁纸为例): 1. **在`AndroidManifest.xml`中添加权限**: ```xml <uses-permission android:name="android.permission.SET_WALLPAPER"/> <service android:name=".WallpaperAutoService"/> ``` 2. **创建自动切换服务`WallpaperAutoService.java`**: ```java public class WallpaperAutoService extends Service { private WallpaperManager wallpaperManager; private Handler handler; private int[] wallpapers = {R.drawable.wall1, R.drawable.wall2, R.drawable.wall3}; private int currentIndex = 0; // 定时任务(30分钟) private Runnable changeTask = new Runnable() { @Override public void run() { try { wallpaperManager.setResource(wallpapers[currentIndex]); currentIndex = (currentIndex + 1) % wallpapers.length; } catch (IOException e) { e.printStackTrace(); } handler.postDelayed(this, 30 * 60 * 1000); // 30分钟 } }; @Override public void onCreate() { super.onCreate(); wallpaperManager = WallpaperManager.getInstance(this); handler = new Handler(Looper.getMainLooper()); } @Override public int onStartCommand(Intent intent, int flags, int startId) { handler.post(changeTask); // 启动定时任务 return START_STICKY; // 确保服务重启[^3] } @Override public IBinder onBind(Intent intent) { return new LocalBinder(); } public class LocalBinder extends Binder { WallpaperAutoService getService() { return WallpaperAutoService.this; } } @Override public void onDestroy() { handler.removeCallbacks(changeTask); // 停止定时器 super.onDestroy(); } } ``` 3. **在Activity中绑定服务并启动**: ```java public class MainActivity extends AppCompatActivity { private WallpaperAutoService wallpaperService; private boolean isBound = false; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { WallpaperAutoService.LocalBinder binder = (WallpaperAutoService.LocalBinder) service; wallpaperService = binder.getService(); isBound = true; } @Override public void onServiceDisconnected(ComponentName name) { isBound = false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 绑定服务(建立持久连接) Intent intent = new Intent(this, WallpaperAutoService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); // 启动后台服务 startService(intent); } @Override protected void onDestroy() { if(isBound) { unbindService(connection); // 解绑服务 } super.onDestroy(); } } ``` #### 关键优势 1. **无Bitmap操作**:直接使用`setResource()`避免Bitmap内存问题[^1] 2. **后台持久运行**: - 使用`START_STICKY`确保服务被系统终止后自动重启[^3] - 绑定服务维持Activity-Service连接 3. **自动切换机制**: ```mermaid graph LR A[Service启动] --> B[初始化定时器] B --> C{等待30分钟} C --> D[切换下一张壁纸] D --> C ``` 4. **资源高效利用**:仅存储资源ID而非Bitmap对象 #### 厂商适配建议 针对华为/小米等定制系统: 1. 在设置中添加应用至自启动白名单 2. 在电池优化设置中关闭对本应用的优化 3. 使用前台服务(添加通知)提高优先级: ```java // 在Service的onCreate()中添加 Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("壁纸自动切换") .setSmallIcon(R.drawable.ic_notification) .build(); startForeground(1, notification); ``` #### 相关问题 1. 如何实现根据时间(早晚)自动切换不同风格的壁纸? 2. 如何确保WallpaperManager.setResource()在不同分辨率设备上显示正常[^4]? 3. 当应用被厂商系统强制停止后,如何重新激活自动切换服务[^3]?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值