I am trying to make an application uninstaller using recyclerview. Everything is working fine but the broadcast receiver doesn't stop receiving even after going to a different application.
I want to unregister when the activity is not visible and register when activity is visible but cannot access activity class from another class (AppsAdapater).
AppsAdapter.java
public class AppsAdapter extends RecyclerView.Adapter<AppsAdapter.ViewHolder>{
Context context1;
List<String> stringList;
IntentFilter intentFilter;
int index;
public AppsAdapter(Context context, List<String> list){
context1 = context;
stringList = list;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
public CardView cardView;
public ImageView imageView;
public TextView textView_App_Name;
public TextView textView_App_Package_Name;
public ViewHolder (View view){
super(view);
cardView = (CardView) view.findViewById(R.id.card_view);
imageView = (ImageView) view.findViewById(R.id.imageview);
textView_App_Name = (TextView) view.findViewById(R.id.Apk_Name);
textView_App_Package_Name = (TextView) view.findViewById(R.id.Apk_Package_Name);
}
}
@Override
public AppsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View view2 = LayoutInflater.from(context1).inflate(R.layout.cardview_layout,parent,false);
ViewHolder viewHolder = new ViewHolder(view2);
intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
intentFilter.addDataScheme("package");
start();
return viewHolder;
}
BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
Log.e(" BroadcastReceiver ", "onReceive called "
+ " PACKAGE_REMOVED ");
Toast.makeText(context, " onReceive !!!! PACKAGE_REMOVED",
Toast.LENGTH_LONG).show();
stringList.remove(index);
notifyItemRemoved(index);
notifyItemRangeChanged(index, getItemCount());
}
}
};
public void destroyer(){
context1.unregisterReceiver(br);
}
public void start(){
context1.registerReceiver(br, intentFilter);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position){
ApkInfoExtractor apkInfoExtractor = new ApkInfoExtractor(context1);
final String ApplicationPackageName = (String) stringList.get(position);
double ApplicationSize= apkInfoExtractor.GetAppSize(ApplicationPackageName);
final String ApplicationLabelName = apkInfoExtractor.GetAppName(ApplicationPackageName);
Drawable drawable = apkInfoExtractor.getAppIconByPackageName(ApplicationPackageName);
viewHolder.textView_App_Name.setText(ApplicationLabelName);
viewHolder.textView_App_Package_Name.setText(String.format("%.2f MB", ApplicationSize));
viewHolder.imageView.setImageDrawable(drawable);
viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.parse("package:"+ApplicationPackageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
index = position;
context1.startActivity(intent);
}
});
}
@Override
public int getItemCount(){
return stringList.size();
}
}
ResultActivity.java
enter code herepublic class ResultActivity extends AppCompatActivity {
RecyclerView recyclerView;
RecyclerView.Adapter adapter;
RecyclerView.LayoutManager recyclerViewLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerViewLayoutManager = new GridLayoutManager(ResultActivity.this, 1);
recyclerView.setLayoutManager(recyclerViewLayoutManager);
adapter = new AppsAdapter(ResultActivity.this, new ApkInfoExtractor(ResultActivity.this).GetAllInstalledApkInfo());
recyclerView.setAdapter(adapter);
}
@Override
public void onPause() {
super.onPause();
Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show();
adapter.destroy();//this line give me a error cannot resolve destroy
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show();
adapter.start();//this line give me a error cannot resolve start
}}
I cannot make those methods static as context must be in non-static. How to access the start() and destroy() methods of AppsAdapter from ResultActivity to register and unregister broadcast? Is there any other way to do it?
I tried to use onResume() and onPaused() in AppsAdapter.java class but it gives me an error.