( 2. Antwort : Ich brauche viel mehr Beitrag dazu)
Nach 8 Stunden Recherche in Android OS und Android Developers Website, um eine Lösung zu finden, um die Aktivität beim clearApplicationUserData
Aufrufen neu zu starten . Endlich würde ich eine finden können netten / Hacking finden können Lösung finden.
Diese Lösung sieht aus wie Zidane Dribble :)
Lassen Sie uns die Lösung vorstellen. zunächst clearApplicationUserData
löscht alle Hinweise der Anwendung , wenn wie aufgerufen wird , Aufgaben, Benachrichtigungen, Alarme usw. daher ausdrücklich Aktivität Berufung ist nicht möglich .
Der implizite Weg ist der einzig mögliche Weg, um Aktivitäten aufzurufen.
Nach ein paar Tests stellte ich fest, dass die manifest
registrierte Anwendung intent-filters
nicht entfernt werden konnte und sie auf eingehende Systemübertragungen warten können .
Ungefähr 98% der Systemübertragungen würden nicht von einer freigegebenen Anwendung empfangen, und die verbleibenden 2% werden möglicherweise nicht sehr bald ausgestrahlt.
Also, was tun? Hmmm ? Komm schon Mann, ich muss eine Lösung finden ...
Bingo, ich muss etwas auslösen, um es vom System zu senden <= sieht hackend aus :)
Also entscheide ich mich für WIFI_STATE_CHANGED, weil
- Easy Access-Berechtigung
- Das System sendet es mit Verzögerung <= Dies stellt sicher, dass die App vor dem Senden geschlossen wird
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();
}
});
}
}
Demo
Denken Sie daran, es ist nur ein Produkt mit minimaler Lebensfähigkeit, das weiterentwickelt werden muss, damit es perfekt funktioniert.
clearApplicationUserData()
?" - Ich bezweifle, dass dies in Ihrer eigenen App möglich ist. Zeigen Sie dem Benutzer eine Nachricht an, in der erläutert wird, dass dies vor dem Aufrufen dieser Methode geschehen wird, und der Benutzer kann die App über den Starter neu starten.