2017-02-14 8 views
0

私はthis answerに従って、アプリケーションのアンインストール検出機能を実装しています。私は基本的にアンインストールイベントが検出されたときにメインアクティビティを開こうとしていますが、私のアプリケーションをアンインストールしても何も起こりません(メインアクティビティはアンインストール前に開かれません)。イベント検出時にアクティビティが開かない

私のコードに何か問題がありますか?

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); 
    } 
} 

放送受信機:

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

最初に、 'QUERY_PACKAGE_RESTART'はAndroid SDKの一部ではありません。第2に、QUERY_PACKAGE_RESTARTは少なくともAndroid 4.0以降では自分のアプリに送信されません。第三に、 'getRunningTasks()'は、プライバシーやセキュリティ上の理由からAndroid 5.0以降で必要なことをしません。 – CommonsWare

+0

@ CommonSWare次に、自分のアプリがアンインストールされていることを検出するにはどうすればよいですか?私のアンドロイド版はkitkat –

+0

です "私のアプリがアンインストールされている時に検出するにはどうすればよいですか?" - うまくいけばそれはもはや可能ではありません。その範囲内では、Androidのセキュリティ上の欠陥を表しています。 – CommonsWare

答えて

0

ユーザーは、Android 4.0以降以来、それをアンインストールするとアプリが知ることはできません。私も同様の問題がありましたが、それを行う方法が見つかりませんでした。 https://developer.android.com/guide/topics/admin/device-admin.html 私はこれがあなたを助けるとは思っていませんが、それは私が見つけた唯一のものです。私は今日見つけた唯一のもの(私は既に私のアプリをあきらめましたが、多分それはあなたを助けることができます)。

関連する問題