简体   繁体   English

注册广播接收器android的正确方法

[英]correct way of registering broadcast receiver android

In my android application, I am registering multiple broadcast receiver that includes: WiFi, Screen and Activity. 在我的Android应用程序中,我正在注册多个广播接收器,其中包括:WiFi,屏幕和活动。 The app is running smoothly on Moto g and Samsung G3 but its stopped sensing Screen on/off, Wifi connect/disconnect and Activity events on another phone after three days of smooth execution. 该应用在Moto g和Samsung G3上运行平稳,但在顺利执行三天后,停止在另一部手机上感应屏幕开/关,Wifi连接/断开和活动事件。 Since app is on user phone, i dont know the model/make. 由于应用程序在用户手机上,因此我不知道型号/制造商。 Other than event sensing, the usual location sensing is working fine (which is scheduled after every 10 mins). 除了事件感测之外,通常的位置感测工作正常(每10分钟安排一次)。 Any ideas what could be wrong? 任何想法可能有什么问题吗? Otherwise, on my test devices it still runs fine (testing for more then 2 weeks). 否则,在我的测试设备上它仍然可以正常运行(测试超过2周)。 For reference, below is the code for screen sensor only. 供参考,以下仅是屏幕传感器的代码。 Also, I tried to register receiver in onstartcommand, but it didn't work on my test devices (See the commented part in screenService) 另外,我尝试在onstartcommand中注册接收器,但是在我的测试设备上不起作用(请参阅screenService中的注释部分)

MainActivity: 主要活动:

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

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

ScreenReceiver: 屏幕接收器:

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

       }
    }

These BroadcastReceivers have to be registered dynamically 这些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

EDIT: MainActivity.java package com.kishore_kumar.stackoverflow; 编辑: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 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");
    }
}
}

You can do this way: 您可以这样做:

Define Receiver in manifest file: 清单文件中定义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>

Now add class which extends BroadcastReceiver : 现在添加它扩展 了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");
            }
    }

Hope this will help you. 希望这会帮助你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM