2016-12-28 90 views
0

我想在Android中關閉屏幕時收到廣播。我寫了下面的代碼。這是Receiver的代碼。屏幕接收器廣播不工作

@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; 
    } 
} 

我正在註冊和註銷Receiver in a Service。代碼如下。

在註冊接收機中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); 
} 

請讓我知道可能是什麼問題。我一直在深入挖掘它。最後兩天浪費在這個上面。似乎沒有任何工作。

+0

使用背景顏色與阿爾法 –

+0

你從哪裏開始服務?服務開始運行的活動是什麼? –

+0

@TharakaDevinda我從主要活動開始服務,是活動和服務正在運行。 –

回答

0

我覺得你太過複雜了。 這是你需要

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()方法中執行作業時,請注意每次調用activity的onCreate()時線程都會啓動。

希望這會有所幫助

+0

謝謝,它現在正在工作。有什麼問題?我不明白爲什麼有什麼問題?如果你能指導我。 –

+0

我認爲你編碼的工廠做了一些事情。無論如何,只要保持簡單就可以讓事情變得更簡單。不客氣。 –