即使我在Android中使用了服务,我的操作也无法正常工作

时间:2018-07-01 03:57:04

标签: android service chronometer

我在android服务上做项目,在我的项目中,我使用按钮启动天文钟,如果我关闭了该应用程序,我需要保持天文钟的状态,你们可以帮我吗?

我对Main Activity.java的代码是

public void onClick(View v) {

   if(v==let_break){
        startService(new Intent(MainActivity.this,runBackground.class));

        Toast.makeText(getApplicationContext(),"I've got this!",Toast.LENGTH_SHORT).show();

        chronometer.setVisibility(View.VISIBLE);
        chronometer.start();
        timer_running=true;
        //let_break.setText("stop");
        let_break.setVisibility(View.INVISIBLE);
        stop_break.setVisibility(View.VISIBLE);
    }
    if(v==stop_break){
        chronometer.stop();
        timer_running=false;
        let_break.setVisibility(View.VISIBLE);
        stop_break.setVisibility(View.INVISIBLE);
        stopService(new Intent(MainActivity.this,runBackground.class));
  }}

我的服务代码是

public class runBackground extends Service {


@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent,int flags, int startId) {
    Toast.makeText(runBackground.this,"service started",Toast.LENGTH_LONG).show();

    return START_STICKY;
}

@Override
public void onDestroy() {
    Toast.makeText(runBackground.this,"service stoped.",Toast.LENGTH_LONG).show();

}
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}}

我的清单是

<application>
 <service android:name=".runBackground" android:exported="false"></service>
</application>

当我单击“开始”按钮吐司显示服务已启动停止按钮显示其已停止 但是当查看正在运行的进程背景时,它表明应用程序服务正在运行,但计时器和按钮已重置。 即使我关闭应用程序,也应该如何保持动作和天文钟表。

3 个答案:

答案 0 :(得分:1)

由于您要在执行之间重置这些值-似乎您需要将数据持久保存到本地存储中。 最简单的方法是使用SharedPreferences。 您可以添加一个简单的帮助程序类:

public class MySharedPreferences {

private static final String PREF_FILENAME = "mybestprefs";

public static void putPrefLong(Context context, String key, long value){
    SharedPreferences prefs = context.getSharedPreferences(PREF_FILENAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putLong(key, value);
    boolean commitResult = editor.commit();
    if (!commitResult){
        Log.e(TAG, "commit failed. key - "+key+", value - "+value);
    }
}

public static long getPrefLong(Context context, String key, long defValue){
    SharedPreferences prefs = context.getSharedPreferences(PREF_FILENAME, Context.MODE_PRIVATE);
    return prefs.getLong(key, defValue);
}
}

在您的chronometer.start()内:

startTimestamp = System.currentTimeMillis();
MySharedPreferences.putPrefLong(context, "start_ts", startTimestamp);

在您的chronometer.stop()内:

// calculate elapsed time:
long elapsedTimeSinceStart = System.currentTimeMillis() - MySharedPreferences.getPrefLong(context, "start_ts", 0);

答案 1 :(得分:0)

在单独的过程中运行服务

   android:process=":something"

答案 2 :(得分:-2)

使用服务有一个很大的缺点,因为Android Oreo及更高版本并不真正支持后台服务。您应该考虑JobIntentSerivceGo through this website,以便更好地理解。