2015-10-21 4 views
0

Ну, несколько месяцев назад я изучил основы андроида, и теперь я пытаюсь научиться запоминать то, что узнал. Таким образом, проблема в том, что я делаю приложение, которое, когда он ловит изменение состояния экрана (экран включен/выключен), он что-то делает. Я хочу, чтобы, когда приложение не работает (потому что пользователь убил его, нажав кнопку дома или что-то в этом роде), он все еще делает то, что я хочу. Я решил использовать приемник, но я не знаю, является ли он правильным вариантом.Запуск приемника, даже если приложение не открыто

Если приложение сведено к минимуму, оно работает, но проблема, когда пользователь нажимает кнопку «последние приложения» и слайд-приложение. Тогда приемник ничего не поймает.

В манифесте я объявил:

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

Моя основная деятельность (может быть, я что-то неправильно там):

public class MainActivity extends Activity { 

    private MyReceiver myReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     myReceiver = new MyReceiver(); 
     registerReceiver(myReceiver, filter); 
    } 


    @Override 
    protected void onDestroy() { 
     if (myReceiver != null) { 
      unregisterReceiver(myReceiver); 
      myReceiver = null; 
     } 
     super.onDestroy(); 

    } 
} 

и мой приемник:

public class MyReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals("android.intent.action.SCREEN_OFF")) { 
      Log.e("In on receive", "In Method: ACTION_SCREEN_OFF"); 
      Toast.makeText(context, "DO SOMETHING",Toast.LENGTH_LONG).show(); 
     } 
     else if (action.equals("android.intent.action.SCREEN_ON")) { 
      Log.e("In on receive", "In Method: ACTION_SCREEN_ON"); 
      Toast.makeText(context, "DO SOMETHING2",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

Действительно оцените, если вы можете взглянуть: D.
Спасибо

ответ

1

Вы зарегистрировали приемник в манифесте. Поэтому не регистрируйте и не регистрируйте его в MainActivity. Это проблема. Поэтому, как только приложение будет убито, вызывается onDestroy(), и ваш ресивер не зарегистрирован и больше не будет слушать.

Объявление приемника в манифесте означает, что ваше приложение всегда будет слушать трансляции. И это именно то, что вы хотите. Поэтому удалите регистрационную/незарегистрированную часть из MainActivity.

UPDATE: Кажется, что SCREEN_ON и SCREEN_OFF не могут быть зарегистрированы с помощью манифеста. Возможно, это связано с соображениями безопасности. Поэтому в этом случае вы должны зарегистрировать это через код. Но проблема здесь в том, что после выхода из приложения вызывается onDestroy(), и вы больше не слушаете. Если вам действительно нужна эта функция, вам нужно создать службу и постоянно запускать ее в фоновом режиме. Вы можете использовать это для прослушивания трансляции.

+0

Итак, в __onDestroy() __ Мне нужно исключить предложение if if и в __onCreate() __ Мне нужно устранить только строки, в которых я создаю __myReceiver__ и __registerReceiver (myReceiver, filter) __ Если я понял это правильно, не так ли? – xampla

+0

Да. Вы можете регистрировать широковещательные приемники через манифест или через Java-код. Поскольку вы уже зарегистрировали его в манифесте, в коде больше не нужно делать это. – Henry

+0

К сожалению, он все еще не работает. Фактически теперь это не работает, даже если приложение работает. Есть идеи? – xampla

Смежные вопросы