Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';卸载应用程序时无法获取接收器_Android_Android Intent_Broadcastreceiver_Uninstallation - Fatal编程技术网

Android Can';卸载应用程序时无法获取接收器

Android Can';卸载应用程序时无法获取接收器,android,android-intent,broadcastreceiver,uninstallation,Android,Android Intent,Broadcastreceiver,Uninstallation,我指的是信息 我编写了相同的程序,但单击卸载按钮时无法获取任何日志信息 我在下面附上我的代码。有人知道这个代码有什么问题吗 我想在使用“单击卸载”按钮时执行一些操作。比如打开浏览器等等 有人能帮我吗 这个问题困扰了我很长时间 我的清单: 。。。 我的广播接收器代码如下: public class UninstallIntentReceiver extends BroadcastReceiver{ @Override public void onReceive(Context conte

我指的是信息

我编写了相同的程序,但单击卸载按钮时无法获取任何日志信息

我在下面附上我的代码。有人知道这个代码有什么问题吗

我想在使用“单击卸载”按钮时执行一些操作。比如打开浏览器等等

有人能帮我吗

这个问题困扰了我很长时间

我的清单:

。。。


我的广播接收器代码如下:

public class UninstallIntentReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

    String [] packageNames = intent.getStringArrayExtra("android.intent.extra.PACKAGES");
    if(packageNames!=null){
        for(String packageName: packageNames){
            if(packageName!=null && packageName.equals("yu.idv.uninstalldetected")){
                Log.i("info", "00000000"); 
               new ListenActivities(context).start();
               Log.i("info", "11111111");

            }
        }
    }
  }

}

class ListenActivities extends Thread{
boolean exit = false;
ActivityManager am = null;
Context context = null;

public ListenActivities(Context con){
    context = con;
    am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
}

public void run(){

    Looper.prepare();

    while(!exit){

         List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(MAX_PRIORITY);

         String activityName = taskInfo.get(0).topActivity.getClassName();


         Log.i("info", "======CURRENT Activity =======::"
                 + activityName);

         if (activityName.equals("com.android.packageinstaller.UninstallerActivity")) {
             exit = true;
             Log.i("info", "2222222222");                
            Toast.makeText(context, "Done with preuninstallation tasks... Exiting Now",            Toast.LENGTH_SHORT).show();
        } else if(activityName.equals("com.android.settings.ManageApplications")) {
            exit=true;
             Log.i("info", "33333333333");
        }
    }
    Looper.loop();
}
public类卸载IntententReceiver扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
String[]packageNames=intent.getStringArrayExtra(“android.intent.extra.PACKAGES”);
如果(packageNames!=null){
for(字符串packageName:packageName){
if(packageName!=null&&packageName.equals(“yu.idv.卸载检测”)){
Log.i(“信息”,“00000000”);
新建ListenActivities(context.start();
Log.i(“信息”,“11111111”);
}
}
}
}
}
类ListenActivities扩展线程{
布尔退出=假;
ActivityManager am=null;
Context=null;
公共列表活动(上下文con){
上下文=con;
am=(ActivityManager)context.getSystemService(context.ACTIVITY\u服务);
}
公开募捐{
Looper.prepare();
当(!退出){
列出taskInfo=am.getRunningTasks(最大优先级);
字符串activityName=taskInfo.get(0.topActivity.getClassName();
Log.i(“信息”,当前活动=
+活动名称);
if(activityName.equals(“com.android.packageinstaller.UninstallerActivity”)){
退出=真;
Log.i(“信息”,“2222”);
Toast.makeText(上下文,“完成预卸载任务…立即退出”,Toast.LENGTH_SHORT.show();
}else if(activityName.equals(“com.android.settings.ManageApplications”)){
退出=真;
日志i(“信息”,“33333”);
}
}
loop.loop();
}

通常,卸载应用程序时,所有资源都会从设备中删除。因此,在卸载时,您无法触发任何操作。

未调用您的
BroadcastReceiver
的原因是您的应用程序仍处于“停止状态”。您的应用程序没有任何
活动
组件。这意味着安装应用程序后,用户将无法启动它。用户从未启动过的应用程序将保持“停止状态”。处于“停止状态”的应用程序将不会接收广播意图

请参阅中的“已停止应用程序的启动控制”部分


编辑:添加更多有关Android 4.x中的
意图.操作_查询_程序包_重新启动
的详细信息

自Android 2.3(我不确定Android 3.x)以来,这种行为似乎发生了变化。在Android 4.0及更高版本中,
InstalledAppDetails
(设置应用程序的一部分)中的代码如下所示:

 private void checkForceStop() {
     if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
         // User can't force stop device admin.
         updateForceStopButton(false);
     } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
         // If the app isn't explicitly stopped, then always show the
         // force stop button.
         updateForceStopButton(true);
     } else {
         Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
                 Uri.fromParts("package", mAppEntry.info.packageName, null));
         intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
         intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
         getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
                 Activity.RESULT_CANCELED, null, null);
     }
 }
因此,如果显示的应用程序是设备管理员,“强制停止”按钮将被禁用。如果显示的应用程序未停止,则“强制停止”按钮将被启用。否则,
Intent.ACTION\u QUERY\u PACKAGE\u RESTART
将被广播。

这意味着只有已停止的非设备管理应用程序才会广播
意图。

我用你的代码在4.0设备上测试了这一点。如果你安装了你的应用程序,然后你转到
设置->应用程序
并选择另一个已被“强制停止”的应用程序(不是你的),你的
onReceive()
将被调用,并带有
意图。操作\u查询\u包\u重新启动

我意识到这可能没有多大帮助,但它至少解释了你所看到的行为


很抱歉,解决此问题花了这么长时间,感谢您的挑战:-)

如果检测到用户单击卸载按钮(而不是卸载结束),应用程序可以在logcat中重新记录包名。我们可以使用logcat info parse packagename来做一些事情。我想引用的意思是。但是我不能实现@。你可以发布如何自定义卸载意图操作吗?我真的需要学习如何实现。非常感谢。@dickfala我正在尝试从中获取卸载程序意图名称logcat但到目前为止,我的观察结果是logcat可能正在缓存所有数据。因此,当我启动我的应用程序读取logcat时,历史记录也会显示出来。一旦我解决了这个问题,如果我成功,我将与它分享。你知道你的
广播接收器是否被调用了吗?添加一些日志以查看是否被调用。我已经添加了登录onReceive。但当我单击“卸载”按钮时,我没有收到任何日志。:(你如何在没有任何启动程序活动的情况下运行你的应用程序?我已尝试添加活动。但我仍然无法接收广播信息。@@你确实启动了应用程序(即:启动活动)安装应用程序后?是的,我启动了我的活动。我附加了我的源代码站点。:(好的。您是卸载自己的应用程序?还是另一个应用程序?当您尝试卸载另一个应用程序时,调用了Ist
onReceive()
?我使用了android菜单功能-设置>应用程序>选择了我的应用程序名称(卸载检测)>单击卸载按钮>单击确定。这一次,我看到的logcat没有显示我的日志信息@@
 private void checkForceStop() {
     if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
         // User can't force stop device admin.
         updateForceStopButton(false);
     } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
         // If the app isn't explicitly stopped, then always show the
         // force stop button.
         updateForceStopButton(true);
     } else {
         Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
                 Uri.fromParts("package", mAppEntry.info.packageName, null));
         intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
         intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
         getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
                 Activity.RESULT_CANCELED, null, null);
     }
 }