gpt4 book ai didi

android - 第 1 部分持久性前台 android 服务,由 UI 启动,也可在 sleep 模式下工作,也可在手机重启时启动

转载 作者:行者123 更新时间:2023-12-04 02:21:16 24 4
gpt4 key购买 nike

Status:--- 同样接受 Karakuri 和 Sharad Mhaske 的回答 ,但自从 Sharad Mhaske 回答 赏金开始 ,赏金应该给他。

第 2 部分制作:part-2 persistent foreGround android service that starts by UI, works at sleep mode too, also starts at phone restart

stack overflow , 仅 一个答案可能是 接受 .我看到两者 回答为 可接受 但必须选择一个(我是随机选择的)。

观众 受邀加入 上/下投票 答案/问题 欣赏努力! .我赞成 Karakuri 的回答以补偿声誉。

Scenario:---

  • 我想让用户点击开始/停止按钮和 从 UI Activity 启动/停止服务。 我已经制作了用户界面,所以不关心那个。但只是按钮单击事件的逻辑。
  • 不是 想要服务绑定(bind)到 UI Activity .如果 Activity 关闭,服务应该继续运行。
  • 想做最努力 服务要持久并且在任何情况下都不会停止。将赋予它最大的权重并将其作为 ForGroundSerice 运行如 它具有更高的重要性等级。 (希望没问题?)
  • 除非点击停止按钮 通过我的应用程序 UI,不希望它被停止 (或应该重新启动自己)即使android回收内存。我和电话的用户,都/将会知道它。服务是最重要的。 即使在 sleep 。

    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?

    }


    }

    Menifest 文件:
          <?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 - implementing startForeground for a service?指向答案1,示例代码。

    Trying to start a service on boot on Android

    Android: Start Service on boot?

    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:---

    我认为这个问题对于大多数与服务打交道的人来说是一种正常的做法。
    在那个愿景中, 请有场景经验且能全面讲解的回答的方面和策略最大样本代码作为 完整版所以这对社区也有帮助。

    对答案上下投票(负责任地),因为这对我来说很重要,他们分享了他们的观点、时间和经验并帮助了我和社区。

    最佳答案

    Que:想尽最大努力使服务持久化,无论如何都不会停止。将赋予它最大的权重并将其作为 ForGroundSerice 运行,因为它具有更高的重要性等级。 (希望没问题?)

    答:您需要使用 START_STICKY Intent 标志启动服务。

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
    }

    Que:如果我需要AlarmManager,如何实现?或任何其他方式?或者只是将操作置于无休止的 while 循环中并在最后休眠 15 分钟?

    答:您需要 在服务中注册 alarmmanager 一些任务后的时间。
    //在服务中注册警报管理器。
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new         Intent("com.xxxxx.tq.TQServiceManager"), PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000 , 30 * 1000 , pendingIntent);

    //现在有一个广播接收器来接收这个 Intent 。
    class Alarmreceiver extends Broadcastreceiver
    {
    //u can to task in onreceive method of receiver.
    }

    //在 list 中为警报接收器操作注册此类。

    Que:服务启动时(通过单击启动按钮)。它应该输入一个条目,以便在手机重新启动时它会自动启动。

    答案: 使用广播接收器来监听启动完成的 Intent 。
    public class StartAtBootServiceReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
    try {
    if( "android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {

    ComponentName comp = new ComponentName(context.getPackageName(), LicensingService.class.getName());
    ComponentName service = context.startService(new Intent().setComponent(comp));
    if (null == service){
    // something really wrong here
    //Log.Write("Could not start service " + comp.toString(),Log._LogLevel.NORAML);
    }
    }
    else {
    //Log.Write("Received unexpected intent " + intent.toString(),Log._LogLevel.NORAML);
    }
    } catch (Exception e) {
    //Log.Write("Unexpected error occured in Licensing Server:" + e.toString(),Log._LogLevel.NORAML);
    }
    }
    }

    //需要在manifest.xml文件中为Action_BOOTCOMPLETED Intent 注册这个接收器
    希望这可以帮助你清理事情:)

    关于android - 第 1 部分持久性前台 android 服务,由 UI 启动,也可在 sleep 模式下工作,也可在手机重启时启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005837/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com