如何将字符串数据从服务传递到我的 activity

how to pass a string data to my activity from a service

我有一个运行计时器的 activity,我想广播该计时器并将接收器设置到我的 activity 并显示计时器。我知道可以使用广播和接收广播意图来完成,但我不知道该怎么做。

这是我的代码

public class MyService extends Service {

    private Vibrator v;
    NotificationCompat.Builder notification;
    private static final int uniqueID = 71399;
    @Override
    public void onCreate() {
        super.onCreate();

        notification = new NotificationCompat.Builder(this);
        notification.setAutoCancel(true);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        SharedPreferences sharedPreferences = getSharedPreferences("Timer", Context.MODE_PRIVATE);
        int dur = sharedPreferences.getInt("duration", 0);

        //background timer
        CountDownTimer countDownTimer = new CountDownTimer(dur,    1000) {
            @Override
            public void onTick(long dur) {
                long millis= dur;
                String hms= String.format("%02d:%02d:%02d",

                        TimeUnit.MILLISECONDS.toHours(millis),
                        TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
                        //seconds
                        ,TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
                );
                startnotif(hms);
                startBroadcast(hms);
            }

            @Override
            public void onFinish() {
                long n[] = {1,1000,500,1000,500,1000,500,1000,500,1000,500,1000,500,1000,500,1000,500,1000};
                v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(n, -1);
                endnotif();
                onDestroy();
            }
        };
        countDownTimer.start();
        return START_STICKY;
    }

    public void onDestroy() {
        stopSelf();
    }

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

    //notification
    public void startnotif(String hms)
    {
        String noT = hms;
        notification.setSmallIcon(R.mipmap.ic_launcher);
        notification.setTicker("apps are blocked!");
        notification.setWhen(System.currentTimeMillis());
        notification.setContentTitle("Be productive!");
        notification.setContentText(hms);
        ClickNotif();
    }

    public void endnotif(){
        notification.setContentText("00:00");
        notification.setTicker("apps are now unblocked!");
        notification.setWhen(System.currentTimeMillis());
        notification.setContentTitle("You survived!");
        notification.setContentText("Apps are now unblocked!");
        ClickNotif();
    }

    //other parts of  notif
    public void ClickNotif(){
        Intent intent1 = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        notification.setContentIntent(pendingIntent);

        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        nm.notify(uniqueID, notification.build());
    } 

目标activity

public class Main2Activity extends AppCompatActivity {

    private Button btntest;
    private TextView timer;
    private Spinner spinner, spinner2;
    public int hours, mins, duration;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        btntest = (Button) findViewById(R.id.startbtn);
        timer = (TextView) findViewById(R.id.Timertxt);

        //setting up 2 spinners
        spinner = (Spinner) findViewById(R.id.hrspinner);
        String [] values = {"00","01","02","03","04","05","06"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, values);
        adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner.setAdapter(adapter);
        spinner2 = (Spinner) findViewById(R.id.minspinner);
        String [] values2 = {"00","01","10","20","30","40","50","60"};
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, values2);
        adapter2.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner2.setAdapter(adapter2);

        //button start
        btntest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String spin=spinner.getSelectedItem().toString();
                hours = Integer.parseInt(spin);
                hours = hours*3600000;
                String spin2=spinner2.getSelectedItem().toString();
                mins = Integer.parseInt(spin2);
                mins = mins*60000;
                duration = hours+mins;
                setParam(duration);
                startService(duration);
            }
        });
    }

    /*timer part
    public void setParam(int param){
        CountDownTimer countDownTimer = new CountDownTimer(param,    1000) {

            @Override
            public void onTick(long param) {
                long millis= param;
                String hms= String.format("%02d:%02d:%02d",

                        TimeUnit.MILLISECONDS.toHours(millis),
                        TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
                        //seconds
                        ,TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
                );
                timer.setText(hms);
            }

            @Override
            public void onFinish() {
                timer.setText("00:00");
            }
        };
        countDownTimer.start();
    }*/

    //saving data and passing intent to service
    public void startService(int duration)
    {
        int d = duration;
        SharedPreferences sharedPreferences = getSharedPreferences("Timer", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putInt("duration", d);
        editor.apply();
        Intent intent = new Intent(this,MyService.class);
        startService(intent);
    }
}

如何在我的文本字段中显示该计时器?请帮忙!

您可以像这样使用 LocalBroadcastManager: 为您服务

 private LocalBroadcastManager broadcaster;
 @Override
 public void onCreate() {
    broadcaster = LocalBroadcastManager.getInstance(this);
  }

private void sendData(){
    Intent intent = new Intent("MyData");
    broadcaster.sendBroadcast(intent);
}

并在任何需要的地方调用 sendData(),然后在 activity 中写入

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    /*
    this called when app receive notification and MainActivity is opened
    * see FcmMessagingService.class to see where it called
    */
    @Override
    public void onReceive(Context context, Intent intent) {
    //  Log.d("broadcaster", "onReceive BaseActivity");
    // write whatever you want and you cant use intent.getString("key");
    }
};

 @Override
protected void onStart() {
    super.onStart();


LocalBroadcastManager.getInstance(this).registerReceiver((mMessageReceiver), new IntentFilter("MyData"));

}