Android程序开机启动&&监听情景模式切换

本文介绍如何在Android应用中实现开机启动一个服务,并通过接收系统广播监听情景模式的切换。通过设置开机启动,服务会在系统启动后立即运行。针对情景模式切换,虽然系统没有提供专门的广播,但可以通过查看LogCat日志来发现系统在切换模式时会发送广播。文章提供了完整的Demo代码,包括MainActivity、BroadcastReceiver和BackgroundService,实现了在开机启动时启动服务,并监听情景模式变化。

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

 

转载地址:http://blog.youkuaiyun.com/sunchaoenter/article/details/6586400

要求:设置一个android应用程序开机启动一个服务,此服务用来监听情景模式的切换。

首先要知道在android中开机启动程序是通过广播机制实现的,在android手机启动完成之后,系统会发送一个名叫android.intent.action.BOOT_COMPLETED的广播,所以我们只要在程序中接收这个广播,然后启动一个后台服务,就会实现程序一开机即启动。

对于监听情景模式的切换,android手机跟其他手机不太一样,没有那些诸如会议模式、户外模式、自定义模式等那么多的模式。系统内置的只有正常模式跟静音模式两种可选,而且是长按关机按钮才出现的。如下图:

一开始我以为系统也应该会发送一个广播,但是找了很多资料没找着。后来我从王涛那学到了一个不错的技巧。假设你现在不知道系统到底会不会发情景模式切换的广播,而且找了很多资料也没有涉及诸如此类的问题,那么现在你可以从LogCat中查看日志文件。在我点击上图中静音模式切换的按钮时,会得到如下日志:

很明显,系统是发了广播的。所以我们同样只要在程序中接收这个广播就OK了。

Demo代码如下:

MainActivity:

  1. package org.sunchao;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4.   
  5. public class MainActivity extends Activity {  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.     }  
  12. }  

BroadcastReceiver:

  1. package org.sunchao;  
  2. import android.content.BroadcastReceiver;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.widget.Toast;  
  6.   
  7. public class BootReceiver extends BroadcastReceiver {  
  8.   
  9.     @Override  
  10.     public void onReceive(Context context, Intent intent) {  
  11.         // 监听情景切换   
  12.         if (intent.getAction().equals("android.media.RINGER_MODE_CHANGED")) {  
  13.             Toast.makeText(context, "情景模式已切换", Toast.LENGTH_LONG).show();  
  14.         }  
  15.         // 设置开机启动   
  16.         Intent intent2 = new Intent(context, BackgroundService.class);  
  17.         intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  18.         context.startService(intent2);  
  19.     }  
  20. }  

 

BackgroundService:

  1. package org.sunchao;  
  2. import android.app.Service;  
  3. import android.content.Intent;  
  4. import android.os.IBinder;  
  5. import android.util.Log;  
  6.   
  7. public class BackgroundService extends Service {  
  8.     private static String TAG = "BackgroundService";  
  9.     @Override  
  10.     public void onCreate() {  
  11.         Log.i(TAG, "onCreate()");  
  12.         super.onCreate();  
  13.     }  
  14.     @Override  
  15.     public void onStart(Intent intent, int startId) {  
  16.         Log.i(TAG, "onStart()");  
  17.         super.onStart(intent, startId);  
  18.     }  
  19.     @Override  
  20.     public void onDestroy() {  
  21.         Log.i(TAG, "onDestroy()");  
  22.         super.onDestroy();  
  23.     }  
  24.     @Override  
  25.     public IBinder onBind(Intent intent) {  
  26.         Log.i(TAG, "onBind()");  
  27.         return null;  
  28.     }  
  29. }  

 

AndroidManifest.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="org.sunchao" android:versionCode="1" android:versionName="1.0">  
  4.     <uses-sdk android:minSdkVersion="8" />  
  5.   
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name=".MainActivity">  
  8.             <intent-filter>  
  9.                 <action android:name="android.intent.action.MAIN" />  
  10.                 <category android:name="android.intent.category.LAUNCHER" />  
  11.             </intent-filter>  
  12.         </activity>  
  13.         <service android:name=".BackgroundService" />  
  14.         <receiver android:name=".BootReceiver">  
  15.             <intent-filter>  
  16.                 <action android:name="android.intent.action.BOOT_COMPLETED" />  
  17.                 <action android:name="android.media.RINGER_MODE_CHANGED" />  
  18.             </intent-filter>  
  19.         </receiver>  
  20.     </application>  
  21.     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  
  22. </manifest>  

 

以上代码开机启动测试成功,查看后台运行的服务(Boot_Complete):

进行模式切换监听也是OK的:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值