如何在Android中从Activity传递值给Service?

3

我需要访问一个简单的整数变量,它保存着editText元素的值。这个值作为一个公共字段存储在我的Activity类中。在我的服务中,我创建了一个来自我的Activity类的对象:

CheckActivity check = new CheckActivity();

我正在尝试通过以下方式访问它:

check.getFirstPosition();

但它返回零。如何将值从Activity传递给Service?

1
这是一个非常重要的问题。服务可以绑定或启动,在同一进程中,此时您可以在任一侧(服务或活动)上使用公共静态变量;在单独的服务中,您可以使用信使或AIDL。顺便说一下,活动是作为意图启动的,而不是像CheckActivity check = new CheckActivity()这样的方式。 - Pomagranite
将变量设为静态的方式起作用了,谢谢。 - Kaan Demirel
3个回答

7

在Android中,无论是Activity还是Service,你需要使用意图(Intent)来在不同的组件之间传递数据。

Intent intent = new Intent(this, YourService.class);
intent.putExtra("your_key_here", <your_value_here>); 

然后按照以下方式启动您的服务 -

startService(intent);

现在你可以使用onBind()或者onStartCommand()(取决于你如何使用你的服务)来使用作为参数传递的intent

String editTextValue = intent.getStringExtra("your_key_here");

现在你可以在任何地方使用editTextValue了。

你可以通过Service的生命周期方法获取Intent对象,但与Activity不同,Service没有getIntent()方法。 - chRyNaN

6
您无法从服务中创建这样的对象。我认为您是Java的新手。当您执行CheckActivity check = new CheckActivity()时,会创建一个新的CheckActivity实例,并且毫无疑问它将返回零。此外,在Android中,您永远不应尝试像这样创建活动对象。
至于您的问题,您可以通过广播接收器将您的editText值传递到您的服务中。
请参阅此处
此外,如果您在创建服务之前拥有editText值,则可以将其作为意图额外信息简单传递,否则您可以使用广播方法。
在您的服务中。
broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (action.equalsIgnoreCase("getting_data")) {
                    intent.getStringExtra("value")
                }
            }
        };

        IntentFilter intentFilter = new IntentFilter();
        // set the custom action
        intentFilter.addAction("getting_data"); //Action is just a string used to identify the receiver as there can be many in your app so it helps deciding which receiver should receive the intent. 
        // register the receiver
        registerReceiver(broadcastReceiver, intentFilter);

在你的活动中
Intent broadcast1 = new Intent("getting_data");
        broadcast.putExtra("value", editext.getText()+"");
        sendBroadcast(broadcast1);

同时在activity的onCreate方法中声明接收器,并在onDestroy方法中取消注册。
unregisterReceiver(broadcastReceiver);

只是好奇,我如何在Service类上使用Broadcast Receiver来直接访问某个Activity类中的editText值? - Kaan Demirel
在你的服务中,按照教程的示例声明你的广播接收器。然后从你的活动中传递一个带有与你的广播接收器相同的操作的意图。在你的服务中,意图将被接收到你的接收器中,你可以从那里提取值。这是非常基础的内容。如果你觉得有用,请点赞/接受答案。 - varunkr
感谢您的详细解释。将我的变量设为静态对我很有用,但我真的很喜欢您的方法。 - Kaan Demirel
@ShadabAnsari 我也这么认为,但是在 stackOverflow 上有些答案说这不应该是个问题,很奇怪,不确定是否应该在活动中像这样使用静态变量。你能说一下为什么不好吗?我只知道这是不好的 :D - varunkr
1
@varunkr 我不愿意尽可能地使用静态变量的唯一原因是,这些值会持续存在并在应用程序中保持可用,直到应用程序被终止,而该值有时可能不是您在后期所期望的。 - Shadab Ansari
显示剩余4条评论

0
不要这样做。应该使用Intent来创建一个Activity。
你可以通过Intent使用context.startService()方法传递值,或者绑定它并通过引用传递值。
你也可以考虑使用BroadcastReceiverHandler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接