( Câu trả lời thứ 2 : tôi cần đóng góp nhiều hơn cho nó)
Sau 8 giờ nghiên cứu trong Hệ điều hành Android và Trang web dành cho nhà phát triển Android để tìm giải pháp khởi động lại hoạt động khi clearApplicationUserData
được gọi. Cuối cùng, tôi sẽ có thể tìm thấy một giải pháp tốt đẹp / hack .
Giải pháp này trông giống như rê bóng zidane :)
Hãy giới thiệu giải pháp. lúc đầu, clearApplicationUserData
xóa tất cả các manh mối của ứng dụng khi được gọi như các tác vụ, thông báo, báo thức , v.v. do đó, việc gọi Hoạt động rõ ràng là không thể .
cách ngầm là cách duy nhất có thể của hoạt động gọi.
Sau một vài thử nghiệm tôi thấy rằng ứng dụng manifest
đã đăng ký intent-filters
sẽ không bị xóa và họ có thể nghe các chương trình phát sóng hệ thống đến .
Khoảng 98% các chương trình phát sóng hệ thống sẽ không được nhận bởi ứng dụng đã bị xóa và 2% còn lại có thể không được phát sóng sớm.
vậy lam gi ? hmmm Thôi nào anh bạn phải tìm một giải pháp ...
bingo, tôi phải kích hoạt một cái gì đó để hệ thống phát nó <= trông hack :)
vì vậy tôi quyết định chọn WIFI_STATE_CHANGED vì
- Quyền truy cập dễ dàng
- Hệ thống phát sóng chậm trễ <= điều này đảm bảo ứng dụng được đóng trước khi phát
tệp kê khai
<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();
}
});
}
}
bản giới thiệu
Hãy nhớ rằng, nó chỉ là một sản phẩm khả thi tối thiểu cần được phát triển nhiều hơn để làm cho nó hoạt động hoàn hảo.
clearApplicationUserData()
không?" - Tôi nghi ngờ điều đó là có thể từ trong ứng dụng của riêng bạn. Hiển thị thông báo cho người dùng giải thích rằng điều này sẽ xảy ra trước khi gọi phương thức đó và người dùng có thể khởi động lại ứng dụng từ trình khởi chạy.