2017-02-14 2 views
0

Ich folge this answer, um App-Detektor zu installieren. Ich versuche grundsätzlich, die Hauptaktivität zu öffnen, wenn ein Deinstallationsereignis erkannt wird, aber wenn ich meine App lösche, passiert nichts (die Hauptaktivität wird vor der Deinstallation nicht geöffnet).Aktivität wird bei Ereigniserkennung nicht geöffnet

Bitte helfen, was ist falsch mit meinem Code?

MainAcivity:

package com.example.appdeveloper.unistalltest; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

Broadcast-Empfänger:

package com.example.appdeveloper.unistalltest; 


import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.Toast; 

public class UninstallIntentReceiver extends BroadcastReceiver { 

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

     // fetching package names from extras 
     String[] packageNames = intent.getStringArrayExtra("android.intent.extra.PACKAGES"); 

     if(packageNames!=null){ 
      for(String packageName: packageNames){ 
       if(packageName!=null && packageName.equals("com.example.appdeveloper.unistalltest")){ 
        // User has selected our application under the Manage Apps settings 
        // now initiating background thread to watch for activity 
        new ListenActivities(context).start(); 
       } 
      } 
     } 
     else { 
      Toast.makeText(context, "No package found in Broadcast Receiver", Toast.LENGTH_LONG).show(); 
     } 
    } 

} 

ListenActivities.java:

package com.example.appdeveloper.unistalltest; 

import android.app.ActivityManager; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Looper; 
import android.util.Log; 
import android.widget.Toast; 
import java.util.List; 


public 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){ 

      // get the info from the currently running task 
      List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(MAX_PRIORITY); 

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

      Log.d("topActivity", "CURRENT Activity ::" 
        + activityName); 

      if (activityName.equals("com.android.packageinstaller.UninstallerActivity")) { 
       // User has clicked on the Uninstall button under the Manage Apps settings 

       //do whatever pre-uninstallation task you want to perform here 
       // show dialogue or start another activity or database operations etc..etc.. 

       context.startActivity(new Intent(context, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

       exit = true; 
       Toast.makeText(context, "Done with preuninstallation tasks... Exiting Now", Toast.LENGTH_LONG).show(); 
      } 
      else if(activityName.equals("com.android.settings.ManageApplications")) { 
       // back button was pressed and the user has been taken back to Manage Applications window 
       // we should close the activity monitoring now 
       exit=true; 
      } 
     } 
     Looper.loop(); 
    } 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.appdeveloper.unistalltest"> 

    <uses-permission android:name="android.permission.GET_TASKS"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver android:name=".UninstallIntentReceiver"> 
      <intent-filter android:priority="0"> 
       <action android:name="android.intent.action.QUERY_PACKAGE_RESTART" /> 
       <data android:scheme="package" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 
+1

Zuerst ist 'QUERY_PACKAGE_RESTART' nicht Teil des Android SDK. Zweitens wird 'QUERY_PACKAGE_RESTART' niemals an deine eigene App gesendet, zumindest nicht unter Android 4.0 oder höher. Drittens wird 'getRunningTasks()' aus Datenschutz- und Sicherheitsgründen nicht das tun, was Sie unter Android 5.0+ wollen. – CommonsWare

+0

@CommonsWare Was kann ich dann tun, um zu erkennen, wenn meine App deinstalliert wird? Meine Android-Version ist kitkat –

+0

"Was soll ich dann tun, um zu erkennen, wenn meine App deinstalliert wird?" - Hoffentlich ist das nicht mehr möglich. In dem Maße, wie es ist, stellt es eine Sicherheitslücke in Android dar. – CommonsWare

Antwort

0

Ihre Anwendung kann nicht wissen, wenn der Benutzer es seit Android 4.0 und höher deinstallieren. Ich hatte ein ähnliches Problem, habe aber keinen Weg gefunden, es zu tun. Die einzigen Dinge, die ich heute gefunden habe (ich habe bereits mit meiner App aufgegeben, aber vielleicht kann es Ihnen helfen) ist dies: https://developer.android.com/guide/topics/admin/device-admin.html Ich bin mir nicht sicher, dass dies Ihnen helfen wird, aber es ist das einzige, was ich gefunden habe.

Verwandte Themen