4.4.1.1 创建/使用私有服务
私有服务是不能由其他应用启动的服务,因此它是最安全的服务。 当使用仅在应用中使用的私有服务时,只要您对该类使用显式意图,那么您就不必担心意外将它发送到任何其他应用。
下面展示了如何使用startService类型服务的示例代码。
要点(创建服务):
将导出属性显式设置为
false。小心并安全地处理收到的意图,即使意图从相同应用发送。
由于请求应用在同一应用中,所以可以发送敏感信息。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="org.jssec.android.service.privateservice" ><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:allowBackup="false" ><activityandroid:name=".PrivateUserActivity"android:label="@string/app_name"android:exported="true" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!-- Private Service derived from Service class --><!-- *** POINT 1 *** Explicitly set the exported attribute to false. --><service android:name=".PrivateStartService" android:exported="false"/><!-- Private Service derived from IntentService class --><!-- *** POINT 1 *** Explicitly set the exported attribute to false. --><service android:name=".PrivateIntentService" android:exported="false"/></application></manifest>
PrivateStartService.java
package org.jssec.android.service.privateservice;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.widget.Toast;public class PrivateStartService extends Service {// The onCreate gets called only one time when the service starts.@Overridepublic void onCreate() {Toast.makeText(this, "PrivateStartService - onCreate()", Toast.LENGTH_SHORT).show();}// The onStartCommand gets called each time after the startService gets called.@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// *** POINT 2 *** Handle the received intent carefully and securely,// even though the intent was sent from the same application.// Omitted, since this is a sample. Please refer to "3.2 Handling Input Data Carefully and Securely."String param = intent.getStringExtra("PARAM");Toast.makeText(this,String.format("PrivateStartService¥nReceived param: ¥"%s¥"", param),Toast.LENGTH_LONG).show();return Service.START_NOT_STICKY;}// The onDestroy gets called only one time when the service stops.@Overridepublic void onDestroy() {Toast.makeText(this, "PrivateStartService - onDestroy()", Toast.LENGTH_SHORT).show();}@Overridepublic IBinder onBind(Intent intent) {// This service does not provide binding, so return nullreturn null;}}
下面是使用私有服务的活动代码:
要点(使用服务):
使用指定类的显式意图,调用同一应用程序的服务。
由于目标服务位于同一应用中,因此可以发送敏感信息。
即使数据来自同一应用中的服务,也要小心并安全地处理收到的结果数据。
PrivateUserActivity.java
package org.jssec.android.service.privateservice;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;public class PrivateUserActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.privateservice_activity);}// --- StartService control ---public void onStartServiceClick(View v) {// *** POINT 4 *** Use the explicit intent with class specified to call a service in the same application.Intent intent = new Intent(this, PrivateStartService.class);// *** POINT 5 *** Sensitive information can be sent since the destination service is in the same application.intent.putExtra("PARAM", "Sensitive information");startService(intent);}public void onStopServiceClick(View v) {doStopService();}@Overridepublic void onStop() {super.onStop();// Stop service if the service is running.doStopService();}private void doStopService() {// *** POINT 4 *** Use the explicit intent with class specified to call a service in the same application.Intent intent = new Intent(this, PrivateStartService.class);stopService(intent);}// --- IntentService control ---public void onIntentServiceClick(View v) {// *** POINT 4 *** Use the explicit intent with class specified to call a service in the same application.Intent intent = new Intent(this, PrivateIntentService.class);// *** POINT 5 *** Sensitive information can be sent since the destination service is in the same application.intent.putExtra("PARAM", "Sensitive information");startService(intent);}}
