有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么关闭应用程序后会重置计时器?

我有一个计时器,可以显示允许用户再次播放的剩余时间。 我意识到服务可以帮我做到这一点。因此,我在单独的进程中创建了一个带有START_STICKY标记的。并使用接收器获取结果。。这样行吗但当我关闭应用程序时,服务将重新启动,一切都将从头开始

Question is : How do I prevent to the restart the service or another? way to fix this problem ?!

泰。问候

my activity:

   public class MainActivity extends Activity{

   @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
   @Override
   protected void onDestroy() {
       super.onDestroy();;
   }
   public static void StartService(Context context,int globalTime,int localTime){

    Intent i= new Intent(context,Services.class);       
    i.putExtra("value", localTime);
    i.putExtra("value2", true);
    context.startService(i);
   }

}

my Reciver:

    public class Reciver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    int defaultValue = -1;
    Toast.makeText(context,String.valueOf(intent.getIntExtra("value", defaultValue), Toast.LENGTH_SHORT).show();
  }
}

my Service:

public class Services extends Service {

int id;
@Override
public void onCreate(){
    alarm();
}

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

   id = startId;
   maxTimerValue = mainIntent.getIntExtra("value", 0);

if(currentTimerValue < maxTimerValue){
        currentTimerValue++;    
        BroadCatster();
    }else{
        currentTimerValue = 0
    }
 }
}
public void alarm(){

    Intent i = new Intent(this, Services.class);
    PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, 1000, pi);

}

public void BroadCatster(){

    Intent intent = new Intent(this,Reciver.class);
    intent.setAction("RECIVER_FILTER");
    intent.putExtra("value", currentTimerValue);
    this.sendBroadcast(intent);
}
}

}

MainFest

<receiver 安卓:name="com.example.Reciver">
  <intent-filter>
    <action 安卓:name="RECIVER_FILTER" />
  </intent-filter>
</receiver>
<service
    安卓:enabled="true"
    安卓:exported="false"
    安卓:name="com.example.Services"
    安卓:label="@string/app_name"
    安卓:process=":Service">
</service>

共 (3) 个答案

  1. # 1 楼答案

    没有完美的方法可以阻止您的服务被停止。START_STICKY并不意味着Android不会终止该服务。如果出现资源短缺,Android可能仍然会终止该服务,STICKY只会比OS在资源短缺消失后重启该服务更有帮助

    所以最基本的问题是,你假设服务永远不会被终止,而你的时间依赖于此。最好将上次播放的时间存储在首选项或SQLlite中(或将其放在onSaveInstance状态的捆绑包中),并在每次使用onStartCommand时从中读取。当然,您需要处理在堆栈溢出上有许多线程的用户时间更改,您可以参考这些线程

  2. # 2 楼答案

    @mr.bug我对“服务”没有任何概念,但我可以为您的计时器提供一个逻辑建议,只需将开始时间保存在共享首选项中,或者任何对您方便的选项中,当您的应用程序再次启动时,取下开始时间和当前时间的差异

  3. # 3 楼答案

    将此添加到服务的onCreate中

    Intent notificationIntent = new Intent(this, MainActivity.class);
    
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);
    
    Notification notification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.app_icon)
                .setContentTitle("Your App")
                .setContentText("")
                .setContentIntent(pendingIntent).build();
    
    startForeground(1111, notification);