Экран приемника вещания не работает

я хочу получить широкий бросок, когда экран выключен в android. Я написал следующий код. Это код получателя.

@Override
public void onReceive(Context context, Intent intent) {

    helper = new FeedReaderDBHelper(context);
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        System.out.println("Screen Off Receiver just received something");
        if(helper.getValue(FeedReaderContract.FeedEntry.onlock).equals("YES"))
        {

            helper.lockAll();
            wasScreenOn = false;
        }
        else if(helper.getValue(FeedReaderContract.FeedEntry.onLock3).equals("YES"))
        {
            System.out.println("Running 3 minutes thread");
            Runner runner = new Runner(context);
            Thread t = new Thread(runner);
            t.setName("LockThreeThread");

            t.start();
        }
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        // and do whatever you need to do here
        wasScreenOn = true;
    }
}

Я регистрирую и отменяю регистрацию получателя в Службе. Код выглядит следующим образом.

Регистрационный приемник в методе onStartCommand

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    isScreenOn = pm.isScreenOn();
    RegisterReceiver();
    //Toast.makeText(getApplicationContext(), "Service Started", Toast.LENGTH_SHORT).show();
    //System.out.println("StartRemove");
    helper = new FeedReaderDBHelper(this);
    names = helper.getNames();
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            startChecker();
        }
    });
    t.start();

    return START_STICKY;
}

И вот как я отменяю регистрацию в onDestroy метода обслуживания.

private void RegisterReceiver()
{
    receiver = Factory.getScreeReceiver();
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_SCREEN_ON);
    registerReceiver(receiver, filter);
}

Пожалуйста, дайте мне знать, что может быть проблемой. Я долго копался в этом. Последние два дня были потрачены на это. Кажется, ничего не работает.

1 ответ

  1. Я думаю, что вы слишком усложняете это.
    Это действие, которое вам понадобится

    public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        Intent startServiceIntent = new Intent(this, MyService.class);
        startService(startServiceIntent);
    
    }
    

    Это услуга

    public class MyService extends Service {
    public MyService() {
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("APP", "Service started");
        ScreenOffReceiver receiver = new ScreenOffReceiver();
        registerReceiver(receiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
    
        return START_STICKY;
    }
    }
    

    И это вещательный приемник

    public class ScreenOffReceiver extends BroadcastReceiver {
        public ScreenOffReceiver() {
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("APP", "EVENT occured");
        }
    }
    

    Я просто опробовал этот код, и ведение журнала работало хорошо.

    Когда вы запускаете это через службу и запускаете новый поток для выполнения задания в методе onStartCommand (), обратите внимание, что поток будет запускаться каждый раз, когда вы вызываете onCreate() действия.

    Надеюсь, это поможет