2011-11-14 12 views
10

私のアプリケーションでは、システムインテントACTION_DEVICE_STORAGE_LOWを受信するためにブロードキャストレシーバを登録しました。私は、携帯電話の内部メモリが不足しているときはいつでも、これが放送されることを期待していました。だから、私はいくつかのアプリをダウンロードした(私の電話は非常に小さな内部メモリを持っている)ので、システムメモリが低いという通知をOSに表示させた。電話機の残量は10〜15 MBです。しかし、私の放送受信機は決してその意図を受けなかった。しかし、システム通知は通知バーにとどまり、内部メモリが不足しているためインターネットを閲覧できません。ACTION_DEVICE_STORAGE_LOWのインテントはいつ放映されますか?

内部メモリ通知が表示されているときはいつでもこのインテントをブロードキャストしますか?それとも私の携帯電話でまだヒットしていないこの放送を送信するメモリのいくつかのさらに低いしきい値はありますか?このドキュメントでは、「ブロードキャストアクション:デバイス上のメモリー不足状態を示すスティッキーなブロードキャスト」としか書かれていません。実際には「低メモリ状態」は定義されていないため、私は何か間違っているのか、それともまだその条件に当たっていないのか分かりません。

public class MemoryBroadcastReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 

     if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) { 
      Log.isExternalStorageProblem = false; 
      Log.clearNotification(Log.externalMemoryNotificationID); 
     } 

     if (action.equals(Intent.ACTION_DEVICE_STORAGE_OK)) { 
      Log.isInternalStorageLow = false; 
      Log.clearNotification(Log.internalMemoryNotificationID); 
     } 

     if (action.equals(Intent.ACTION_DEVICE_STORAGE_LOW)) { 
      Log.isInternalStorageLow = true; 
      Log.displayMemoryNotification("Internal Storage Low", 
        "The internal storage is low, Please fix this.", 
        "Please clear cache and/or uninstall apps.", Log.internalMemoryNotificationID); 
     } 
    } 
} 

私は受信機を初期化サービスは、インテントフィルタを追加し、(他のものの間)に登録している:ここで

は私BroadCastReceiverのコードです

private MemoryBroadcastReceiver memoryBroadcastReciever = new MemoryBroadcastReceiver(); 

public void registerBroadcastReceiver() { 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(Intent.ACTION_DEVICE_STORAGE_OK); 
    filter.addAction(Intent.ACTION_MEDIA_MOUNTED); 
    filter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW); 
    filter.addDataScheme("file"); 

    this.getApplicationContext().registerReceiver(memoryBroadcastReciever, filter); 
} 

    @Override 
    public void onCreate() { 
     registerBroadcastReceiver(); 
} 
+0

ここにコードを投稿してください –

+0

私のコードを投稿しました。 DallaRosaの答えは素晴らしく、10%の内蔵ストレージが残っていると放送がうまくいくと思いますが、まだ放送を受信できませんでした。 – mattgmg1990

+2

誰かが興味がある場合、私は放送を受信する私の問題に答えを見つけました。このインテントはデフォルトのデータスキーマと一致しています(インテントフィルタにデータスキームを追加しないこと)。その後、問題なく動作にマッチします。 ACTION_MEDIA_MOUNTEDにファイルのデータスキーマが追加されている必要があるため、私が受け取った3つのアクションと一致する2つのフィルタを作成しました。 – mattgmg1990

答えて

20

TL ; DR

デバイスメーカがデフォルト設定を変更しない限り、フリーm emoryは内部デバイスメモリの10%に達します。

ロングバージョン

私はその意図のためのAndroidのソースコードをgreppedと私はに位置

DeviceStorageMonitorServiceと呼ばれるクラス(になった:フレームワーク/ベース/サービス/ javaの/ COM /android/server/DeviceStorageMonitorService.java

のjavadocから:

このクラスは、デバイス上のディスク容量である
の容量を監視するサービスを実装しています。デバイスの空き容量が調整可能なしきい値(セキュアな設定パラメータ、デフォルトの 10%)よりも小さい場合、デバイスに空き容量が少なくても
である場合、ユーザに警告する低メモリ通知が表示されます。 ユーザがメモリ不足通知をクリックすると、アプリケーション マネージャアプリケーションが起動し、ユーザに空き容量 スペースを許可します。

だからあなたはそれを持っています。デバイスメーカーがそれを変更しない限り、10%になります。 (ライン354)

mContext.sendStickyBroadcast(mStorageLowIntent); 

放送が終了した後も、あなたが受信機を登録することで、データをつかまえることができることを意味します。もう少しソースコードをチェックアウト

は、DeviceStorageMonitorはスティッキーブロードキャストを送信しますその意図で Android Developer - Contextから

: 他の人が素早くて、そのデータを取得できるように

あなたは、放送後の周りの滞在を送信する意向 を意味する「粘着性」であるsendBroadcast(意図)を実行は、完了です戻り値は です。registerReceiver(BroadcastReceiver、IntentFilter)。それ以外の方法では、 はsendBroadcast(Intent)と同じように動作します。

希望します。

+1

ありがとう!あなたが私が尋ねた質問に絶対に答えたので、私はあなたの答えを受け入れました。電話機が10%の利用可能な内部ストレージを持っている場合、通知/ブロードキャストが送信されることは間違いありません。私はそれを確認しました。しかし、私のアプリケーションが意図したとおりにインテントを受け取っていない理由はまだわかりません。私は、あなたが言及したように定期的に値をチェックすることによって放送がスティッキーであるという事実を利用しようとしますが、それが起こったときにもブロードキャストを受け取りたいので、私は自分の通知をユーザに提示することができます。 – mattgmg1990