Status:---
我同样接受 Karakuri 和 Sharad Mhaske 的回答,但是由于 Sharad Mhaske是在赏金开始后回答的,所以赏金应该给他。
第 2 部分制作:第 2部分由 UI 启动的持久前台 android 服务,也可以在睡眠模式下工作,也可以在手机重启时启动
中stack overflow
,只能接受一个答案。我认为这两个答案都是可以接受的,但必须选择一个(我是随机选择的)。
邀请观众对答案/问题进行投票/否决以感谢您的努力!. 我赞成 Karakuri 的回答以补偿声誉。
Scenario:---
我想让用户单击启动/停止按钮并从 UI 活动启动/停止服务。我已经制作了 UI,所以不在乎。但只是按钮点击事件的逻辑。
不希望服务绑定到 UI 活动。如果活动关闭,服务应该继续运行。
要尽最大努力使服务保持持久并且在任何情况下都不会停止。将给予它最大的权重并运行它,
ForGroundSerice
因为它具有更高的重要性等级。(希望没问题?)除非我的应用程序 UI单击停止按钮,否则即使 android 回收内存,也不希望它停止(或应该重新启动)。我和手机的用户,都/将会知道它。服务是最重要的。甚至在睡觉时。
details= 我的应用程序执行一些操作,在用户提供的时间(通常为 15 分钟)内休眠,唤醒并再次执行操作。这永远不会结束)
如果我需要
AlarmManager
,如何实现?或任何其他方式?或者只是把操作放在while loop and sleep for 15 minuts
最后?服务启动时(通过单击启动按钮)。它应该输入一个条目,以便在手机重新启动时自动启动。
QUESTION:---
Primary Question:
只是无法为该场景找到最佳策略......并且还停留在一小段代码上,使用哪一个以及如何使用。
从 stackoverflow.com 问题、developer.android.com 和一些谷歌结果中收集的点点滴滴,但无法在集成中实现。
请阅读请求部分。
Secondary Question:
我代码中的注释就是那些小问题。
Research and Code:---
战略:
want this to happen every time the user opens the UI.
//Start Button:-----
//check if ForGroundService is running or not. if not running, make var/settings/etc "serviceStatus" as false
<-------(how and where to stare this and below stated boolean?)
//start ForGroundService
<-------(how?)
//make "SericeStatus" as true
//check if "ServiceStartOnBoot" is false
//Put ForGroundService to start on boot -------(to make it start when ever the phone reboots/restarts)
<-------(how?)
//make "ServiceStartOnBoot" as true
// the boolean can also be used to check the service status.
//Stop Button:------
//makes SericeStatus and ServiceStartOnBoot as false
//stops service and deletes the on boot entry/strategy
启动/停止服务的 Activity UI 类:
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
//some button here to start / stop and their onClick Listners
Intent mySericeIntent = new Intent(this, TheService.class);
}
private void startMyForGroundService(){
startService(mySericeIntent);
}
private void stopMyForGroundSerice(){
stopService(mySericeIntent);
/////// is this a better approach?. stopService(new Intent(this, TheService.class));
/////// or making Intent mySericeIntent = new Intent(this, TheService.class);
/////// and making start and stop methods use the same?
/////// how to call stopSelf() here? or any where else? whats the best way?
}
}
服务类:
public class TheService extends Service{
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startForeground(1, new Notification());
////// will do all my stuff here on in the method onStart() or onCreat()?
return START_STICKY; ///// which return is better to keep the service running untill explicitly killed. contrary to system kill.
///// http://developer.android.com/reference/android/app/Service.html#START_FLAG_REDELIVERY
//notes:-// if you implement onStartCommand() to schedule work to be done asynchronously or in another thread,
//then you may want to use START_FLAG_REDELIVERY to have the system re-deliver an Intent for you so that it does not get lost if your service is killed while processing it
}
@Override
public void onDestroy() {
stop();
}
public void stop(){
//if running
// stop
// make vars as false
// do some stopping stuff
stopForeground(true);
/////// how to call stopSelf() here? or any where else? whats the best way?
}
}
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:debuggable="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.myapp.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>
<activity
android:name="com.example.myapp.SettingsActivity"
android:label="@string/title_activity_settings" >
</activity>
</application>
</manifest>
References:---
Android - 为服务实现 startForeground?指向答案1,示例代码。
http://developer.android.com/guide/components/services.html
http://developer.android.com/reference/android/app/Service.html
http://developer.android.com/training/run-background-service/create-service.html我不喜欢。
http://developer.android.com/guide/components/processes-and-threads.html我的研究起点
Requests:---
我认为这个问题对于大多数处理服务的人来说是一种正常的做法。在该愿景中,请仅在您有场景经验并且能够以最大示例代码作为完整版本全面解释方面和策略的情况下回答,这样对社区也有帮助。
对答案进行上下投票(负责任地),因为这对我很重要,谁分享了他们的观点、时间和经验,并帮助了我和社区。