持续在后台运行服务.例如,必须启动服务,即使应用程序关闭,也会显示20秒的Toast消息.
public class AppService extends IntentService {
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
public AppService() {
super("AppService");
}
@Override
protected void onHandleIntent(Intent workIntent) {
Toast.makeText(getApplicationContext(), "hai", Toast.LENGTH_SHORT).show();
SystemClock.sleep(20000);
}
}
Run Code Online (Sandbox Code Playgroud) 根据我的理解,一个人IntentService只能一次处理一个Intent,因为它共享一个工作线程来完成它的所有工作.但是如果IntentService我的应用程序中有多个s,它们可以并行运行,还是它们共享单个工作线程?
随着Oreo中引入的新后台服务限制,我很难找到一个地方来澄清在后台运行应用程序时是否仍然可以从JobScheduler启动IntentServices。
我有一个基于地理围栏的非常重要的功能,该功能需要在篱笆断开后运行intentService。我花了很长时间设置它,以便在篱笆破损且应用程序处于“牛轧糖”的“打for”状态时排队等待工作。当重新打开网络连接窗口时,作业最终由操作系统运行时,我在intentService中一个接一个地剥离每个作业。从技术上来说,当应用程序不在前台时正在启动服务,或者由于使用JobScheduler而仍然允许这样做时,我现在可以不再执行此操作吗?
android android-intentservice android-jobscheduler android-8.0-oreo
我尝试摆脱此处所述的IntentService处理时间。由于Android O背景限制。但是我无法将带有push info作为参数的Bundle Extras 传递给from 。有什么办法可以将Bundle放入数据中吗?GCMWorkManagerBroadcastReceiverWorkManager
android google-cloud-messaging android-intentservice android-bundle android-workmanager
I'm starting an IntentService from MainActivity:onCreate and I noticed this crash from the crash reporting only on Android Oreo above:
java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.company.mobile/com.company.mobile.gcm.RegistrationIntentService }: app is in background uid UidRecord{c96fbae u0a184 TPSL idle procs:1 seq(0,0,0)}
at android.app.ContextImpl.startServiceCommon()(ContextImpl.java:1577)
at android.app.ContextImpl.startService()(ContextImpl.java:1532)
at android.content.ContextWrapper.startService()(ContextWrapper.java:664)
at cs.a()(FirebaseUtility.java:42)
at com.company.mobile.MainActivity.onCreate()(MainActivity.java:81)
at android.app.Activity.performCreate()(Activity.java:7136)
at android.app.Activity.performCreate()(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate()(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity()(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity()(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute()(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks()(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute()(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage()(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage()(Handler.java:106)
at android.os.Looper.loop()(Looper.java:193)
at android.app.ActivityThread.main()(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke()(Method.java:-2)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run()(RuntimeInit.java:493)
at …Run Code Online (Sandbox Code Playgroud) android illegalstateexception android-intentservice android-8.0-oreo
好的。这是场景。我有一个用户填写的表单来创建一个 Match 对象。我使用 anIntentService将信息写入后台线程上的文件。如果在boolean中传递了“true”的intenta,则ScoreFile也写入了相应的 a 。GlobalMatch是一个单例对象这里是IntentService代码:
public class WriteMatchService extends IntentService {
private static final String EXTRA_SCORES_FILE = "scores_file";
public static final String REFRESH_MATCH_LIST_INTENT_FILTER = "refresh_match_list";
public static Intent getIntent(Context context, boolean writeScoresFile) {
Intent intent = new Intent(context.getApplicationContext(),
WriteMatchService.class);
intent.putExtra(EXTRA_SCORES_FILE, writeScoresFile);
return intent;
}
public WriteMatchService() {
super("WriteMatchService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
boolean writeScoresFile = false;
if (intent != null) {
if (intent.hasExtra(EXTRA_SCORES_FILE)) …Run Code Online (Sandbox Code Playgroud) 我在使用IntentService的ContentProvider时遇到问题.
我计划在我的应用程序中使用IntentService在手机完成启动时重新安排一些警报,但首先我需要从ContentProvider中提取一些数据.根据这些 链接,我可以通过注册BroadcastReceiver并从那里启动IntentService来实现这一点.这就是我做的:
OnBootReceiver.java
public class OnBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent scheduleServiceIntent = new Intent(context, ScheduleService.class);
context.startService(scheduleServiceIntent);
}
Run Code Online (Sandbox Code Playgroud)
ScheduleService.java
public class ScheduleService extends IntentService implements Loader.OnLoadCompleteListener<Cursor> {
private AlarmManager alarmManager;
@Override
public void onCreate() {
super.onCreate();
alarmManager = (AlarmManager) this.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
}
@Override
protected void onHandleIntent(Intent intent) {
String[] projection = new String[] {
Contract._ID,
Contract.START_TIME,
Contract.DATE,
Contract.NAME,
Contract.TYPE};
mCursorLoader = new CursorLoader(this, MyContentProvider.MyURI,
projection, selection, selectionArgs, SOME_ID);
mCursorLoader.registerListener(ID, this);
mCursorLoader.startLoading(); …Run Code Online (Sandbox Code Playgroud) android android-contentprovider android-broadcast android-intentservice
使用intentservice获取7 Rss Feed链接的数据,并在后台使用"Google Volley"并使用ResultReceiver获取结果,但我无法配置如何等待凌空响应完成它的工作以触发标记ResultReceiver显示MainActivity中的数据
rss android intentservice android-volley android-intentservice
我的一位同行开发人员编写了intent service一个 API 调用,然后休眠 2 分钟。醒来后,它再次发送。
下面是代码:
public class GpsTrackingService extends IntentService {
....
@Override
protected void onHandleIntent(Intent intent) {
do{
try{
//make API call here
//then go to sleep for 2 mins
TimeUnit.SECONDS.sleep(120);
} catch(InterruptedException ex){
ex.printStackTrace();
}
} while (preferences.shouldSendGps()); //till the user can send gps.
}
....
}
Manifest
<service android:name=".commons.GpsTrackingService" />Run Code Online (Sandbox Code Playgroud)
当手机处于活动状态时,这工作正常。但是,每当手机进入打瞌睡模式时,它都无法唤醒。
使用报警管理器会WAKE permission解决这个问题吗?
我刚刚获得了代码库,需要在今天内解决这个问题。如果有人可以提供帮助,那就太好了。
android android-intentservice android-6.0-marshmallow android-doze
我正在做一个项目,我使用带有wakefulBroadcastReceiver 的意图服务来安排警报和发送通知。到目前为止没有问题。但我希望当我打开我的应用程序时,它不再显示通知。请问这个问题有什么想法吗?
我正在尝试启动一个IntentService来注册Android O上的firebase云消息.
在Android O上,不允许"在不允许的情况下"启动Intent Service,并且每个人都告诉我使用JobService而不是如何使用它.
JobInfo.Builder应该有什么限制才能有"允许它的情况",我一直得到相同的IllegalStateException
这是我的JobService
@Override
public boolean onStartJob(JobParameters params) {
Intent intent = new Intent(this, RegistrationIntentService.class);
getApplicationContext().startService(intent);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
public static void scheduleJob(Context context) {
ComponentName serviceComponent = new ComponentName(context, MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(MyJobService.JOB_ID, serviceComponent);
builder.setMinimumLatency(1 * 1000); // wait at least
JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
if(jobScheduler != null) jobScheduler.schedule(builder.build());
}
Run Code Online (Sandbox Code Playgroud) 出于某种原因,我的单例存储库是从后台线程多次创建的,但是,synchronized应该有帮助.有人可以帮忙吗?如果需要,我将提供代码片段和github链接.
我的IntentService类:
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.d(MainActivity.TAG, "ArticleIntentService - onHandleIntent");
LiveData<List<Article>> liveArticles = ArticleRepository.getInstance(getApplication())
.loadFromNetwork(PAGE_NUMBER, PAGE_SIZE);
PAGE_NUMBER++;
liveArticles.observeForever(articles -> {
Log.d(MainActivity.TAG, "onStartJob - onChanged!!!!!!");
// liveArticles.removeObserver(this);
NotificationUtils.showNotification(context, articles.get(0).getSectionName(), articles.get(0).getWebTitle());
});
}
Run Code Online (Sandbox Code Playgroud)
我的存储库:
public static ArticleRepository INSTANCE;
public static synchronized ArticleRepository getInstance(Application application){
if(INSTANCE == null){
Log.d(TAG, "ArticleRepository getInstance is NULL");
return new ArticleRepository(application);
}
return INSTANCE;
}
private ArticleRepository(Application application) {
Log.d(TAG, "ArticleRepository constructor");
mContext = application;
mArticles = new MutableLiveData<>();
ArticleRoomDatabase db = ArticleRoomDatabase.getInstance(application);
mArticleDao = …Run Code Online (Sandbox Code Playgroud)