繁体   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