5

次の構造を持つライブラリを構築しています。

MySDK{
   public static void init(Context context){
      registerReceivers(); // Register connectivity BroadcastReceiver here
   }

   public static void performAction(){};
}

意図した使用法: 私のライブラリのユーザーは、作成した最初のアクティビティでinit()を呼び出します。問題は、BroadcastReceiverの登録を解除せず、アプリを閉じるとリークすることです。deinit()というメソッドを作成し、lib のユーザーにActivityを離れるときにそれを呼び出すように依頼することもできますが、リソースを解放するためのより信頼できる方法はありますか?

なぜレシーバーが必要なのですか?

インターネット接続がなく、performAction()がデータを送信できない場合は、接続状態の変化を検出するためにレシーバーを登録します。

4

5 に答える 5

0

android.app.Application を拡張してこれらのメソッドを実装することを考えましたか:

void onCreate() 

void onLowMemory()

onCreate 内で必要なすべての BroadcastReceiver を登録し、onLowMemory 内で登録解除できます。

このクラスの参照を取得するには、context.getApplicationContext() を呼び出して、それを Application サブクラスにキャストします。

最後に、アプリでこのソリューションを使用するには、これらの情報を次のように AndroidManifest.xml 内のタグ内に配置する必要があります。

<application
  android:allowBackup="true"
  android:icon="@drawable/ic_launcher"
  android:label="@string/app_name"
  android:name="[fully qualified name of your Application subclass]" >
...
</application>
于 2013-09-02T11:34:55.063 に答える
0

すべてのアクティビティでレシーバーが必要な場合は、レシーバーを登録するサービスを作成する必要があります。ここで、サービスの作成方法を確認できます。

レシーバーの登録を解除するには、現在フォアグラウンドにあるパッケージ名を知っているユーザーがアプリを終了したことを検出できます。レシーバーが不要になったときにレシーバーの登録を解除しています。アプリケーションやアクティビティではなく、サービスに作成およびアタッチされているため、ユーザーがアプリを終了してもリークしません。

public String getForegroundApp() throws NameNotFoundException{ 

        RunningTaskInfo info = null;
        ActivityManager am;
        am = (ActivityManager)mContext.getSystemService(ACTIVITY_SERVICE);
        List<RunningTaskInfo> l = am.getRunningTasks(1000);
        System.out.println(l);
        Iterator <RunningTaskInfo> i = l.iterator();


        String packName = new String();
        String appName = new String();
        ApplicationInfo appInfo = new ApplicationInfo();

        while(i.hasNext()){
            info = i.next();
            packName = info.topActivity.getPackageName();
            if(!packName.equals("com.htc.launcher") && !packName.equals("com.android.launcher")){ //this could be what is causing the problem. not sure.
                packName = info.topActivity.getPackageName();
                break;
            }
            info = i.next();
            packName= info.topActivity.getPackageName();
            break;          
            }
        return packName;
        }

とにかく、メソッドのようなものを作成stop()し、ユーザーがそれを呼び出して、アプリを終了し、ライブラリが不要になったことを知ったときに、必要なものをすべてファイナライズする必要があると思います。

于 2013-09-03T14:32:50.453 に答える
0

onReceive メソッドが終了したら(最後に)レシーバーの登録を解除できます。

しかし、これがあなたに適しているかどうかはわかりません。それはあなたの受信機が何をするかによって異なります.

SMS送信/配信受信者を登録するときにうまくいきました..

于 2013-08-26T20:42:23.870 に答える