Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将数据从服务传递到活动_Android_Android Activity - Fatal编程技术网

Android 将数据从服务传递到活动

Android 将数据从服务传递到活动,android,android-activity,Android,Android Activity,我有自己运行的服务(服务自动启动) 我有这个活动 在此活动中,按钮启动方法DoIt(): 在我的服务中,当我按下按钮时,一些数据被写入变量data,该方法起作用 我可以在日志中看到数据: public String getMessage(String data) { ... Log.d(TAG, "Our Data: " + data); return date; ... 但我如何通过按下按钮在我的活动(按钮下)中看到这些数据 谢谢。您无法从您的活动中查看此数据。 创建一个应用程序类将

我有自己运行的服务(服务自动启动)

我有这个活动
在此活动中,按钮启动方法
DoIt()

在我的服务中,当我按下按钮时,一些数据被写入变量
data
,该方法起作用
我可以在日志中看到
数据

public String getMessage(String data) {
... 
Log.d(TAG, "Our Data: " + data);
return date;
...   
但我如何通过按下按钮在我的活动(按钮下)中看到这些数据

谢谢。

您无法从您的活动中查看此数据。

创建一个应用程序类将使事情变得更容易。您可以将数据保存在应用程序类中,以便服务可以更新数据,而活动可以检索数据。不确定这是否是您想要的。

您需要将服务绑定到您的活动。绑定服务后,您可以访问服务中的方法。看看这个例子,了解如何


您还可以向服务中添加一个侦听器,以便在数据更改时立即通知您的活动

向您的活动添加一个处理程序,如下所示:-

Handler handler = new Handler() {
        public void handleMessage(Message message) {
            Object path = message.obj;
            if (message.arg1 == RESULT_OK && path != null) {
                Toast.makeText(context,
                        "Success" + path.toString(), Toast.LENGTH_LONG)
                        .show();
            } else {
                Toast.makeText(context, "Operation failed.",
                        Toast.LENGTH_LONG).show();
            }

        };
    };
 Messenger messenger = (Messenger) extras.get("MESSENGER");
                Message msg = Message.obtain();
                msg.arg1 = data;//your value here
                msg.obj = data;
                try {
                    messenger.send(msg);
                } catch (android.os.RemoteException e1) {
                    Log.w(getClass().getName(), "Exception sending message", e1);
                }
并从消息对象中的服务发送值,如下所示:-

Handler handler = new Handler() {
        public void handleMessage(Message message) {
            Object path = message.obj;
            if (message.arg1 == RESULT_OK && path != null) {
                Toast.makeText(context,
                        "Success" + path.toString(), Toast.LENGTH_LONG)
                        .show();
            } else {
                Toast.makeText(context, "Operation failed.",
                        Toast.LENGTH_LONG).show();
            }

        };
    };
 Messenger messenger = (Messenger) extras.get("MESSENGER");
                Message msg = Message.obtain();
                msg.arg1 = data;//your value here
                msg.obj = data;
                try {
                    messenger.send(msg);
                } catch (android.os.RemoteException e1) {
                    Log.w(getClass().getName(), "Exception sending message", e1);
                }
希望它能工作。

将数据从IntentService发送到Activity 关键词是广播接收机

BroadcastReceiver在这种情况下非常方便

  • 从IntentService发送广播
  • 在活动中接收广播
  • 从服务发送数据

    public class YourService extends IntentService {
    
      public YourService() {
        super("yourService");
      }
    
      protected void onHandleIntent(@Nullable Intent intent) {
    
        sendDataToActivity()
      }
    
      private void sendDataToActivity()
      {
    
        Intent sendLevel = new Intent();
        sendLevel.setAction("TIMER_ACTION");
        sendLevel.putExtra( "TIMER_VALUE","This is the value from service");
        sendBroadcast(sendLevel);
    
      }
    
    }
    
    从服务接收数据
    为此,您需要向
    广播接收器注册您的
    活动

    public class YourActivity extends AppCompatActivity {
    
       TimerReceiver receiver;
    
       @Override
       public void onCreate(Bundle savedInstanceState)
       {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.track_wifi_activity_layout);
           receiver = new TimerReceiver();
           registerReceiver(receiver, new IntentFilter("TIMER_ACTION"));  //<----Register
       }
    
       @Override
       public void onStop()
       {
          super.onStop();
          unregisterReceiver(receiver);           //<-- Unregister to avoid memoryleak
       }
    
       class TimerReceiver extends BroadcastReceiver {
    
           @Override
           public void onReceive(Context context, Intent intent) {
    
              if(intent.getAction().equals("TIMER_ACTION"))
              {
                  int level = intent.getStringExtra("TIMER_VALUE");
    
                  // Show it in activity
              }
    
           }
    
        }
    
     }
    
    公共类YourActivity扩展了AppCompative活动{
    定时器接收机;
    @凌驾
    创建时的公共void(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.track\u wifi\u activity\u layout);
    接收器=新的TimerReceiver();
    
    registerReceiver(receiver,new IntentFilter(“TIMER_ACTION”);//对不起,我不知道怎么做:(你能给我更多的例子吗?谢谢。不幸的是,android开发者指南中的信息太模糊了。如果你加几行代码作为例子,可能会更有帮助。我有字符串数据。msg.arg1=data(类型不匹配:无法从字符串转换为int)Messenger Messenger=(Messenger)extras.get(“Messenger”);(extras无法解析)/**在启动服务时使用**/Messenger Messenger=新Messenger(处理程序);intent.putExtra(“Messenger”,Messenger);intent.putExtra(“urlpath”,“无论这是我的要求是什么”);startService(intent);您可以向arg1添加整数参数,如0或1,然后在收到响应时检查是否存在整数参数。在这种情况下,将不会发送您的消息,因为您的活动的当前状态未处于活动状态。或者您也可以从服务启动活动。具体取决于您的要求