解题思路:
要实现定制Android系统中开机启动某个service,需要在系统启动时自动启动该service。可以通过以下几种方式实现:
- 
在AndroidManifest.xml文件中注册service,并设置android:enabled=”true”和android:exported=”true”属性,使其可以被其他应用程序调用。然后在系统启动时,通过Intent启动该service。 
- 
在系统启动时,通过BroadcastReceiver接收系统启动广播,然后在BroadcastReceiver中启动该service。 
- 
在系统启动时,通过init.rc文件启动该service。 
- framework中启动自定义service
在AndroidManifest.xml文件中注册service,并设置android:enabled=”true”和android:exported=”true”属性,使其可以被其他应用程序调用。然后在系统启动时,通过Intent启动该service。
在AndroidManifest.xml文件中添加以下代码:
<service android:name=".MyService" android:enabled="true" android:exported="true" />在MyService类中添加以下代码:
public class MyService extends Service { 
      @Override 
       public int onStartCommand(Intent intent, int flags, int startId) {
               // 在此处添加需要执行的代码
              return START_STICKY; 
        } 
      @Override 
       public IBinder onBind(Intent intent) { return null; }
 }在MainActivity类中添加以下代码:
public class MainActivity extends AppCompatActivity { 
            @Override
           protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState); 
              setContentView(R.layout.activity_main);
            Intent intent = new Intent(this, MyService.class);
             startService(intent); } 
     }在系统启动时,通过BroadcastReceiver接收系统启动广播,然后在BroadcastReceiver中启动该service。
在AndroidManifest.xml文件中添加以下代码:
<receiver android:name=".BootReceiver">
 <intent-filter>
 <action android:name="android.intent.action.BOOT_COMPLETED" /> 
</intent-filter>
 </receiver> 
<service android:name=".MyService" android:enabled="true" android:exported="true" />在BootReceiver类中添加以下代码:
public class BootReceiver extends BroadcastReceiver { 
          @Override
           public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
                 { Intent serviceIntent = new Intent(context, MyService.class); 
                   context.startService(serviceIntent); }
          } 
    }在MyService类中添加以下代码:
public class MyService extends Service { 
                @Override 
                public int onStartCommand(Intent intent, int flags, int startId) {
          // 在此处添加需要执行的代码 return START_STICKY;
 } 
                 @Override 
                 public IBinder onBind(Intent intent) 
                { return null; }
 }在系统启动时,通过init.rc文件启动该service。
在init.rc文件中添加以下代码:
service myservice /system/bin/app_process -Xzy
 com.example.myservice 
com.example.myservice.MyService
 class main 
user root 
group root
oneshot在MyService类中添加以下代码:
public class MyService extends Service { 
@Override 
             public int onStartCommand(Intent intent, int flags, int startId) { 
                // 在此处添加需要执行的代码 
                return START_STICKY; 
        } 
            @Override 
              public IBinder onBind(Intent intent) 
             { return null; } 
}当然可以从framework中启动service,具体实现步骤如下:
- 
在framework中添加一个系统服务,用于启动service。 
在framework中添加一个系统服务,用于启动service。可以在frameworks/base/services/core/java/com/android/server/SystemServer.java文件中添加以下代码:
private void startCustomService() { 
    ServiceManager.addService("custom_service", new CustomService()); 
}其中,CustomService是自定义的service类。
- 
在CustomService类中实现启动service的逻辑。 
在CustomService类中实现启动service的逻辑。可以在CustomService类中添加以下代码:
public class CustomService extends ICustomService.Stub { 
                 @Override 
              public void startService() throws RemoteException { 
                       Intent intent = new Intent(); 
                       intent.setComponent(new ComponentName("com.example.myservice", 
                       "com.example.myservice.MyService"));
                         startServiceAsUser(intent, UserHandle.SYSTEM); 
              }
      }其中,com.example.myservice是自定义service所在的应用程序包名,com.example.myservice.MyService是自定义service的类名。
- 
在AndroidManifest.xml文件中注册CustomService。 
在AndroidManifest.xml文件中注册CustomService。可以在AndroidManifest.xml文件中添加以下代码:
<service android:name=".CustomService" android:enabled="true" android:exported="true" />- 
在自定义应用程序中调用CustomService。 
在自定义应用程序中调用CustomService。可以在自定义应用程序中添加以下代码:
ICustomService customService = ICustomService.Stub.asInterface(ServiceManager.getService("custom_service")); 
try { customService.startService(); } 
catch (RemoteException e) 
 { e.printStackTrace();
 }其中,ICustomService是自定义的AIDL接口。
通过以上步骤,就可以在framework中启动自定义的service了。
还有一种最简单省事的方式:
可以直接在SystemServer.java中启动自定义的service,具体实现步骤如下:
- 
在SystemServer.java中启动自定义的service。 
可以在SystemServer.java的startOtherServices方法中添加以下代码:
private void startOtherServices() { 
// 启动自定义的
    service Intent intent = new Intent(); 
    intent.setComponent(new ComponentName("com.example.myservice", 
      "com.example.myservice.MyService"));
     startServiceAsUser(intent, UserHandle.SYSTEM); 
}其中,com.example.myservice是自定义service所在的应用程序包名,com.example.myservice.MyService是自定义service的类名。
- 
在AndroidManifest.xml文件中注册自定义的service。 
在AndroidManifest.xml文件中注册自定义的service。可以在AndroidManifest.xml文件中添加以下代码:
<service android:name=".MyService" android:enabled="true" android:exported="true" />通过以上步骤,就可以在SystemServer.java中启动自定义的service了。










暂无评论内容