Android Serviceサービスが殺されない妙技です。
ServiceはAndroidシステムの一つのコンポーネントで、Activityと同じレベルですが、彼は自分で運転できなくて、バックグラウンドでしか動作できません。他のコンポーネントと対話できます。
Androidの開発過程では、startServiceを呼び出すたびに、Serviceの対象となるオンストップCommand(Intent,int,int)方法を呼び出して、オンストップCommand方法で処理します。
Android公式文書から、onStartCommandは4つのintの戻り値があることを知っています。まず、簡単にintの戻り値の役割を説明します。
一、onStartCommandは4種類の戻り値があります。
START_STICKY:serviceプロセスがkillによって失われた場合、serviceの状態は開始状態となりますが、配信されたintentオブジェクトは保留されません。その後、システムはserviceの再作成を試みます。サービス状態はスタート状態ですので、サービスを作成すると必ずオンストップCommand(Intent,int)メソッドを呼び出します。この期間中に任意の起動コマンドがserviceに渡されない場合、パラメータIntentはnullになります。
START_NOT_STICKY:「非粘性的」です。これを使って値を返した場合、ワンストップCommandを実行した後、サービスが異常にキルトされ、システムは自動的にサービスを再開しません。
START_REDELIVER_INTENT:Intentを再送します。これを使って値を返した場合、ワンストップを実行した後、サービスが異常にキルトされ、システムが自動的にサービスを再開し、Intentの値を入力します。
START_STICKY_COMPATIBILITY:START_STICKYの互換版ですが、サービスがキルによって再開されることは保証されていません。
二、殺されないサービスを作成する。
1.serviceに次の方法を書き換える方法は、3つの戻り値、START_があります。STICKY(またはSTART_)STICKY_COMPATIBILITYはserviceがkillに掉われてから自動的に書き換えて作成します。
コアプログラムとなり、360で殺すプロセスの時も、myReceiverは相変わらず有効で、serviceの再生を保証します。えっと、
KILL問題:
1.settings中stop service
on Destroyメソッドでは、startServiceを呼び出してServiceの再起動を行います。
2.settingsにおけるforce stopアプリケーション
捕捉システムで放送する(actionはandroid.intent.actions.PACKAGE_RESTART ED)
3.第三者の助けを借りてキルダウンタンスキーを適用する
serviceの優先度を上げて、プログラム署名、またはadb pushからsystem\apなどに行く。
data/ap下のアプリケーションに比べて、そのManifest.xmlファイルにpersistent属性をtrueとすると、out-off-memory killerの影響を受けないように、system/ap下のアプリケーションがより多くの特権を享受することができる。アプリケーション'Phone'のAndroid Manifest.xmlファイルのようです。
Androidの開発過程では、startServiceを呼び出すたびに、Serviceの対象となるオンストップCommand(Intent,int,int)方法を呼び出して、オンストップCommand方法で処理します。
Android公式文書から、onStartCommandは4つのintの戻り値があることを知っています。まず、簡単にintの戻り値の役割を説明します。
一、onStartCommandは4種類の戻り値があります。
START_STICKY:serviceプロセスがkillによって失われた場合、serviceの状態は開始状態となりますが、配信されたintentオブジェクトは保留されません。その後、システムはserviceの再作成を試みます。サービス状態はスタート状態ですので、サービスを作成すると必ずオンストップCommand(Intent,int)メソッドを呼び出します。この期間中に任意の起動コマンドがserviceに渡されない場合、パラメータIntentはnullになります。
START_NOT_STICKY:「非粘性的」です。これを使って値を返した場合、ワンストップCommandを実行した後、サービスが異常にキルトされ、システムは自動的にサービスを再開しません。
START_REDELIVER_INTENT:Intentを再送します。これを使って値を返した場合、ワンストップを実行した後、サービスが異常にキルトされ、システムが自動的にサービスを再開し、Intentの値を入力します。
START_STICKY_COMPATIBILITY:START_STICKYの互換版ですが、サービスがキルによって再開されることは保証されていません。
二、殺されないサービスを作成する。
1.serviceに次の方法を書き換える方法は、3つの戻り値、START_があります。STICKY(またはSTART_)STICKY_COMPATIBILITYはserviceがkillに掉われてから自動的に書き換えて作成します。
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
return START_STICKY_COMPATIBILITY;
//return super.onStartCommand(intent, flags, startId);
}
または
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
flags = START_STICKY;
return super.onStartCommand(intent, flags, startId);
// return START_REDELIVER_INTENT;
}
@Override
public void onStart(Intent intent, int startId)
{
//
IntentFilter localIntentFilter = new IntentFilter("android.intent.action.USER_PRESENT");
localIntentFilter.setPriority(Integer.MAX_VALUE);//
myReceiver searchReceiver = new myReceiver();
registerReceiver(searchReceiver, localIntentFilter);
super.onStart(intent, startId);
}
2.Serviceのon Destroy()でServiceを再起動します。
public void onDestroy()
{
Intent localIntent = new Intent();
localIntent.setClass(this, MyService.class); // Service
this.startService(localIntent);
}
3.ラジオを作成する
public class myReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
context.startService(new Intent(context, Google.class));
}
}
4.Android Manifest.xmlに登録放送myReceiverとMyServiceサービス
<receiver android:name=".myReceiver" >
<intent-filter android:priority="2147483647" ><!-- -->
<!-- -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
<!-- -->
<action android:name="android.intent.action.USER_PRESENT" />
<!-- -->
<action android:name="android.media.RINGER_MODE_CHANGED" />
</intent-filter>
</receiver>
<service android:name=".MyService" >
注:ロック解除、起動、シーンの切り替え放送には、起動完了、携帯電話の状態などの権限が必要です。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
ZTE U 795携帯電話Android 4.0.4バージョンadb pushからsystem\ap下android:persistent="true"コアプログラムとなり、360で殺すプロセスの時も、myReceiverは相変わらず有効で、serviceの再生を保証します。えっと、
KILL問題:
1.settings中stop service
on Destroyメソッドでは、startServiceを呼び出してServiceの再起動を行います。
2.settingsにおけるforce stopアプリケーション
捕捉システムで放送する(actionはandroid.intent.actions.PACKAGE_RESTART ED)
3.第三者の助けを借りてキルダウンタンスキーを適用する
serviceの優先度を上げて、プログラム署名、またはadb pushからsystem\apなどに行く。
data/ap下のアプリケーションに比べて、そのManifest.xmlファイルにpersistent属性をtrueとすると、out-off-memory killerの影響を受けないように、system/ap下のアプリケーションがより多くの特権を享受することができる。アプリケーション'Phone'のAndroid Manifest.xmlファイルのようです。
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
設定後、アプリはシステムのコアレベルにアップします。