被Android服务困惑

时间:2011-04-21 15:53:37

标签: android service timer

我已经彻底阅读了有关服务的文档,但我仍然对如何使用/编写服务感到困惑。

我想要完成的事情: 我的主要活动:   用户选择计时器的所有选项,然后单击按钮以使用单击启动计时器(在服务中)。我正在尝试使用putExtra将选项传递给服务。

该服务会将变量收集到新变量中以供服务使用。

我有一个onCreate部分,它调用我在服务中声明的公共计数器,但不在onCreate部分。我还声明了所有需要从这里从活动传递的选项枚举的变量。

我是否需要绑定到服务以使用putExtra真正传递变量?

我有一个onStart,我试图通过执行一系列获取来枚举变量值。这是由活动前面提到的按钮触发的。活动内部 - 例如:

mSet.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            //if toggled on
            if (mEnableDisable.isChecked()){
                getCurrentTime();
                //start passing our variables to the service
                Intent passvars = new Intent(getBaseContext(),TimerService.class);
                passvars.putExtra("mHour24", mHour24);
                     //start the service now
                     startService(new Intent(TimerService.class.getName()));
            }
        }
    });

服务内部 - 例如:

public void onStart(Intent intent, int startId) {
     super.onStart(intent, startId);
     //Collecting data from Activity for calcs
     Bundle getvars = intent.getExtras();
     mHour24 = getvars.getInt("mHour24");
             //start the counter now that I have my values
             countDown.start();

}

此外,如果我可以在不崩溃的情况下启动服务,我需要将值传递回活动。所以我想我在服务中使用putExtra,在活动中使用getExtra。我需要再次绑定到服务以获取新值吗?

如果我需要,我可以按下按钮进行绑定。如果程序退出,我还会在主要活动中添加一个部分,但随后会重新绑定并收集该值。我试图提取的价值是柜台剩余的时间。因此,在柜台服务内部我会有一个onTick将剩余时间放入变量并执行该变量的putExtra,在活动中我想收集该值并在UI中显示它。

这是我的第一次服务尝试,我只是不确定如何正确创建和使用。提前感谢所有的帮助,并对这么长篇大论的帖子感到抱歉。

更新 所以我现在有服务。我只是无法从服务中获取信息到主要活动。

我添加了一个函数来尝试从按钮单击启动服务后启动的服务中检索数据:

startService(passvars);
                //Init. variable for getDisplayInf() function to update the display with counter strings
                Running = 1;
                getDisplayInf();

getDisplayInf()ex:

public void getDisplayInf() {
        //Intent stIntent = new Intent(MainActivity.this,MainActivity.class);
        //Intent passvars = new Intent(MainActivity.this,Service.class);
        Bundle getvars = getIntent().getExtras();
        String Remaining;
        String CountDown;
        do {
            Remaining = getvars.getString("Remaining");
            CountDown = getvars.getString("CountDown");
            mRemaining.setText(Remaining);
            mCountDown.setText(CountDown);
            Running = getvars.getInt("Running");
        }
        while (Running == 1);
    };

计时器将在完成时将Running变量设置为0。 只要我点击按钮并使用这个新功能就会崩溃应用程序。

在服务中,我正在柜台的onTick上执行此操作:

            @Override
        public void onTick(long millisUntilFinished) {
            Running = 1;
            Remaining = "Time Remaining:  ";
            CountDown = formatTime(millisUntilFinished);
            ticker();
        }

自动收报机代码:

public void ticker () {
         Intent passvars = new Intent(Service.this,MainActivity.class);
        //this is for the activity to keep looping to grab the countdown values while running this timer

        //now send it to the activity
        passvars.putExtra("Running", Running);
        //String Values to be passed to the activity

        //now send it to the activity
        passvars.putExtra("mRemaining", Remaining);


        //now send it to the activity
        passvars.putExtra("mCountDown", CountDown);
     };

3 个答案:

答案 0 :(得分:1)

尝试使用passvars Intent启动服务,而不是创建新的第二个意图:

Intent passvars = new Intent(MainActivity.this,TimerService.class);
passvars.putExtra("mHour24", mHour24);
//start the service now
startService(passvars);

答案 1 :(得分:0)

如果您的活动想要从您的服务中获取价值,您有几个选择:

  1. 从Activity向服务发送Intent并使用ResultReceiver异步获取结果。 Claszen在这里给出的链接非常好。

  2. 使用活页夹。您可以进行与结果一起返回的同步调用。

  3. 实施内容提供商。此选择用于制作您自己的数据检索和存储组件。

答案 2 :(得分:0)

我意识到我可以通过使用通知管理器获得我想要的用户意识。所以我实现了通知管理器并在那里显示了我的倒计时信息onTick()。

这对我来说最有效的原因是因为我的服务在技术上是一个远程服务(设置在自己的进程中运行,在清单文件中定义。)连接到远程服务并获取它要复杂得多数据同步(这就是我想要的。)通知管理器选项实际上对我来说最好,因为程序停靠它的图标并在每一秒更新通知。