我有一个服务类型类,它在 onCreate 方法中启动计时器任务,当用户按下按钮时,我需要从 MainActivity 停止计时器。我知道我必须在我的服务中保留对计时器的引用,但我不知道如何做到这一点,需要一些帮助!

请看一下我的代码

package com.example.timertest; 
 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
    Button button; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        button = findViewById(R.id.button); 
        button.setOnClickListener(this); 
        startService(new Intent(this, TimeService.class)); 
 
    } 
 
    @Override 
    public void onClick(View v) { 
        if(v.getId() == R.id.button){ 
            // i need here to call mTimer.cancel() in TimeService.class 
            // 
        } 
    } 
} 

//这是 TimeService.java

package com.example.timertest; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.support.annotation.Nullable; 
import android.widget.Toast; 
 
 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 
 
public class TimeService extends Service { 
    public Timer mTimer; 
    private Handler mHandler = new Handler(); 
    long NOTIFY_INTERVAL = 60 * 1000 * 1; // 1 min 
 
    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
        return null; 
    } 
 
    @Override 
    public void onCreate() { 
        if (mTimer != null) { 
            mTimer.cancel(); 
        } else { 
            mTimer = new Timer(); 
        } 
        mTimer.scheduleAtFixedRate(new RefreshDataTimerTask(), 0, NOTIFY_INTERVAL); 
    } 
 
    class RefreshDataTimerTask extends TimerTask { 
 
        @Override 
        public void run() { 
            mHandler.post(new Runnable() { 
 
                @Override 
                public void run() { 
                    Toast.makeText(getApplicationContext(), getDateTime(), Toast.LENGTH_LONG).show(); 
                } 
            }); 
        } 
 
        private String getDateTime() { 
            SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd - HH:mm:ss]"); 
            return sdf.format(new Date()); 
        } 
    } 
} 
 

//以及在 list 中注册的服务

<service android:name=".TimeService"/> 

我尝试调用 mTimer.cancel(),但得到了空引用,因为似乎我已经创建了服务类的新实例。

此示例显示了每分钟包含日期和时间的 Toast,我希望当例如 15 秒过去并按下按钮时,计时器将被取消并从头开始重新开始计数 60 秒。在这个服务中,我还有很多其他的东西,比如通知、 channel 、共享首选项等等,所以如果我只能使用计时器对象进行操作,那就太好了。

请您参考如下方法:

看看这个 API documentaionthis 。在您可以直接访问服务方法之后,有一个示例说明如何将服务绑定(bind)到 Activity 。

成功绑定(bind)后,您可以在服务中添加方法来停止计时器:

public void stopMyTimer() { 
    mTimer.cancel(); 
} 

并从Activity调用此方法


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!