Intereting Posts
Как протестировать с помощью Espresso PendingIntent, сгенерированного TaskStackBuilder Могу ли я делать вычисления внутри dimens.xml? Что происходит на системном уровне при входящем звонке? Gradle не удалось с помощью Facebook SDK, Fresco lib и Retrofit? Как использовать горизонтальную полосу прокрутки gridview в android? Как настроить зависимость Maven для Guice 3.0 для использования без АОП? Android: добавление двух текстовых представлений программно Применяйте различные стили к кнопке при нажатии Как отключить ответы на Crashlytics? Как захватить экран как можно быстрее через adb? Возможно ли иметь несколько стилей внутри TextView? Услуги Android: привязка по требованию против привязки к #onCreate () Android: не удается завершить установку из-за конфликтной зависимости EditText: не может вводить контент, когда EditText имеет фокус иногда Андроид, получивший манифест слияния с ошибкой после обновления до новой версии gradle

Как сохранить работу в фоновом режиме

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

В основном я хочу, чтобы это запускалось, даже когда приложение закрыто. Он должен начать другое действие, как только кнопка питания будет нажата 3 или более раз.

Если вы знаете решение, пожалуйста, дайте мне полный код или ссылку на ответ.

Мне как-то удалось написать этот код, но он не работает:

UpdateService.java

Это класс обслуживания, который я использовал:

import android.app.Service; import android.content.BroadcastReceiver; import android.content.Intent; import android.content.IntentFilter; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class UpdateService extends Service { BroadcastReceiver mReceiver; @Override public void onCreate() { super.onCreate(); // register receiver that handles screen on and screen off logic IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); mReceiver = new MyReceiver(); registerReceiver(mReceiver, filter); } @Override public void onDestroy() { unregisterReceiver(mReceiver); Log.i("onDestroy Reciever", "Called"); super.onDestroy(); } @Override public void onStart(Intent intent, int startId) { boolean screenOn = intent.getBooleanExtra("screen_state", false); if (!screenOn) { Log.i("screenON", "Called"); Toast.makeText(getApplicationContext(), "Awake", Toast.LENGTH_LONG) .show(); } else { Log.i("screenOFF", "Called"); Toast.makeText(getApplicationContext(), "Sleep", Toast.LENGTH_LONG) .show(); } } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } } 

MyReceiver.java

 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyReceiver extends BroadcastReceiver { private boolean screenOff; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { screenOff = true; } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { screenOff = false; } Intent i = new Intent(context, UpdateService.class); i.putExtra("screen_state", screenOff); context.startService(i); } } 

mainfest.xml

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

Пожалуйста, также укажите, нужно ли мне включать что-либо в файл mainactivity.java или mainactivity.java для перенаправления.

Я использовал эти разрешения:

 <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

У вас нет полного кода, чтобы точно знать, но позвольте мне сделать обоснованное предположение:

Вы не реализовали приложение или мероприятие?

Я думаю, вам нужно хотя бы один из них зарегистрировать приемник в onCreate () onResume () обратные вызовы, просто указывая приемник в манифесте. MIGHT NOT work.

И отладка в eclipse или любой другой среде IDE с интеграцией Android может быть очень полезной, поскольку она показывает процессы вашего приложения, и вы можете точно знать, воспитываются ли они или нет. Небольшая отладка должна рассказать вам, правильно ли работает ваш приемник.

Если вы хотите поделиться больше кода, мы можем, конечно, обсудить дальше.

Попробуй это?

 MyService public class MyService extends Service { @Override public void onCreate() { super.onCreate(); ... if (!registered) { MyReceiver mybroadcast = new MyReceiver() { registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON)); registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF)); } } } MyReceiver public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ... } } BootStartUpReciever public class BootStartUpReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Start Service On Boot Start Up Intent service = new Intent(context, MyService.class); context.startService(service); } } Manifest <service android:name="my.package.MyService" /> <receiver android:name="my.package.BootStartUpReciever" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </receiver> 

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

 //Application class. public class MyApplication extends Application { static String TAG = "MyApplication"; @Override public void onCreate() { super.onCreate(); IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); intentFilter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // screen off if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.d(TAG, Intent.ACTION_SCREEN_OFF); //screen on } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { Log.d(TAG, Intent.ACTION_SCREEN_ON); // To open your main activity. Intent i = new Intent(); i.setClass(context, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } }, intentFilter); } } // Manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hopabit.wakeup" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.hopabit.wakeup.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Чтобы ваша работа работала, вам нужно вставить ее в поток. Убедитесь, что служба находится в дополнительном потоке, потому что сервис для себя не является дополнительным процессом или потоком. Это можно сделать, например, с помощью Handler .

 HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME); thread.start(); handlerThreadId = thread.getId(); serviceLooper = thread.getLooper(); serviceHandler = new ServiceHandler(serviceLooper); 

Я видел ваш код. Вы очень близки к решению.

Зарегистрируйте свой широкоэкранный приемник как на экране событий, так и на экране внутри функции onCreate ()

 if (!registered) { MyReceiver mybroadcast = new MyReceiver() { registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON)); registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF)); } 

Поддерживайте int counter в общих предпочтениях или где-либо еще, инициализируйте его с помощью 0 сначала и увеличивайте этот счетчик в onReceive ():

 public class MyReceiver extends BroadcastReceiver { private boolean screenOff; @Override public void onReceive(Context context, Intent intent) { int counter = get counter value from shared preference. if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { screenOff = true; //increment the counter++ } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { screenOff = false; //increment the counter++ } if(counter>3){ Intent i = new Intent(context, UpdateService.class); i.putExtra("screen_state", screenOff); context.startService(i); } } } 

Вы можете начать обслуживание и повторять его часто, а также прослушивать событие в Boot. Вы можете использовать эту ссылку, в которой есть служба, работающая все время. https://github.com/commonsguy/cwac-wakeful Это может помочь в вашей проблеме.

Я думаю, что вам нужно использовать IntentService.

Я скажу тебе почему:

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

Что вам нужно сделать, так это сохранить в памяти (с помощью объекта Application) или другой Singleton время включения / выключения экрана.

Если вам нужна дополнительная помощь, просто дайте мне знать