( 2ª resposta : preciso de muito mais contribuição)
Após 8 horas pesquisando no sistema operacional Android e no site para desenvolvedores do Android , a fim de encontrar uma solução para reiniciar a atividade quando clearApplicationUserData
for chamada. Finalmente, eu seria capaz de encontrar uma boa solução para hackers .
Esta solução parece zidane drible :)
Vamos apresentar a solução. a princípio, clearApplicationUserData
limpa todas as pistas do aplicativo quando é invocado, como tarefas, notificações, alarmes e etc., portanto, é impossível chamar explicitamente a atividade .
maneira implícita é a única maneira possível de chamar atividade.
Após alguns testes, descobri que o aplicativo manifest
registrado intent-filters
não seria removido e eles podem ouvir as transmissões do sistema .
Aproximadamente, 98% das transmissões do sistema não seriam recebidas pelo aplicativo liberado e que 2% restantes poderiam não ser transmitidos muito em breve.
então o que fazer ? hmmm? vamos lá cara, eu preciso encontrar uma solução ...
bingo, preciso acionar algo para que o sistema o transmita <= parece hackear :)
então eu decido escolher WIFI_STATE_CHANGED porque
- Permissão de acesso fácil
- Sistema o transmite com atraso <= isso garante que o aplicativo seja fechado antes da transmissão
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();
}
});
}
}
demonstração
lembre-se, é apenas um produto mínimo viável que precisa ser mais desenvolvido para torná-lo perfeito.
clearApplicationUserData()
?" - Duvido que isso seja possível no seu próprio aplicativo. Mostre uma mensagem ao usuário explicando que isso acontecerá antes de chamar esse método, e o usuário poderá reiniciar o aplicativo a partir do iniciador.