簡體   English   中英

注冊廣播接收器android的正確方法

[英]correct way of registering broadcast receiver android

在我的Android應用程序中,我正在注冊多個廣播接收器,其中包括:WiFi,屏幕和活動。 該應用在Moto g和Samsung G3上運行平穩,但在順利執行三天后,停止在另一部手機上感應屏幕開/關,Wifi連接/斷開和活動事件。 由於應用程序在用戶手機上,因此我不知道型號/制造商。 除了事件感測之外,通常的位置感測工作正常(每10分鍾安排一次)。 任何想法可能有什么問題嗎? 否則,在我的測試設備上它仍然可以正常運行(測試超過2周)。 供參考,以下僅是屏幕傳感器的代碼。 另外,我嘗試在onstartcommand中注冊接收器,但是在我的測試設備上不起作用(請參閱screenService中的注釋部分)

主要活動:

Intent intentscreen = new Intent(getApplicationContext(), ScreenService.class);
startService(intentscreen);

ScreenService:

    private final BroadcastReceiver mybroadcast = new ScreenReceiver();
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        /* if (intent!=null)
        {
            IntentFilter screenStateFilter = new IntentFilter();
            screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
            screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
            registerReceiver(mybroadcast, screenStateFilter);
        }*/
        return START_STICKY;
    }
    @Override
    public void onCreate (){
        super.onCreate();

        IntentFilter screenStateFilter = new IntentFilter();
        screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
        screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(mybroadcast, screenStateFilter);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        unregisterReceiver(mybroadcast);
     }
}

屏幕接收器:

public class ScreenReceiver extends BroadcastReceiver {

       @Override
       public void onReceive(Context context, Intent intent) {
           if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
               Log.i("Check","Screen went OFF");
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                Log.i("Check","Screen went ON");

       }
    }

這些BroadcastReceivers必須動態注冊

android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
android.intent.action.TIME_TICK

編輯:MainActivity.java包com.kishore_kumar.stackoverflow;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

BroadcastReceiver mybroadcast;
IntentFilter screenStateFilter;
static boolean alreadyListening = false; 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mybroadcast = new ScreenBroadcastReceiver();
    screenStateFilter = new IntentFilter();
    screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
    screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
If (!alreadyListening)
{
    registerReceiver(mybroadcast, screenStateFilter);
alreadyListening = true;
}


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

ScreenBroadcastReceiver.java

package com.kishore_kumar.stackoverflow;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class ScreenBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        Log.e("Check", "Screen went OFF");
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        Log.e("Check","Screen went ON");
    }
}
}

您可以這樣做:

清單文件中定義Receiver

<receiver android:name=".ScreenOnOffListener" >
   <intent-filter>
     <action android:name="android.intent.action.SCREEN_OFF" />
     <action android:name="android.intent.action.SCREEN_ON" />
    </intent-filter>
</receiver>

現在添加它擴展 了BroadcastReceiver

public class ScreenOnOffListener extends BroadcastReceiver {

       @Override
       public void onReceive(Context context, Intent intent) {
           if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
               Log.i("Check","Screen OFF");
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                Log.i("Check","Screen ON");
            }
    }

希望這會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM