(2番目の答え:私はそれにもっと多くの貢献が必要です)
が呼び出されたときにアクティビティを再開するためのソリューションを見つけるために、8時間後にAndroid OSおよびAndroid Developers Webサイトで調査しましたclearApplicationUserData
。最後に、私は素晴らしい/ハッキングソリューションを見つけることができます。
このソリューションはジダンドリブルのように見えます:)
ソリューションを紹介しましょう。最初に、タスク、通知、アラームなどのclearApplicationUserData
ように呼び出されたときにアプリケーションのすべての手掛かりをクリアします。そのため、明示的なアクティビティの呼び出しは不可能です。
暗黙的な方法は、アクティビティを呼び出す唯一の可能な方法です。
いくつかのテストを行った後、manifest
登録されたアプリケーションintent-filters
は削除されず、システムブロードキャストをリッスンできることがわかりました。
およそ、98%のシステムブロードキャストのはによって受信されないクリアアプリケーションとすることを2%は非常にすぐに放送されない場合があります残りました。
じゃあ何をすればいいの ?うーん?人に来る私は解決策を見つけなければなりません...
ビンゴ、 それをシステムブロードキャストするために何かをトリガーする必要があります <=ハッキングに見えます:)
だから私はWIFI_STATE_CHANGEDを選ぶことにしました
- 簡単アクセス許可
- システムは遅延時にそれをブロードキャストします<= これにより、ブロードキャストの前にアプリが確実に閉じられます
manifest.xml
<receiver
android:name=".PackageDataClearedReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
MainActivity.java
public class MainActivity extends AppCompatActivity {
ActivityManager am;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCompatButton btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
if (am != null) {
ExecutorService pool = Executors.newFixedThreadPool(2);
final Collection<Future> futures = new HashSet<Future>();
futures.add(pool.submit(new Runnable() {
@Override
public void run() {
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
wifiManager.setWifiEnabled(false);
am.clearApplicationUserData();
}
}));
for (Future future : futures) {
future.isDone();
}
}
}
}).start();
}
});
}
}
デモ
覚えておいてください、それはそれを完璧に機能させるためにもっと開発する必要がある単なる実行可能な最小の製品です。
clearApplicationUserData()
ですか?」-私はあなた自身のアプリ内からそれが可能であることを疑います。これがそのメソッドを呼び出す前に発生することを説明するメッセージをユーザーに表示し、ユーザーはランチャーからアプリを再起動できます。