Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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 Fragments_Service_Timer - Fatal编程技术网

Android 如何将字符串数据从服务传递到片段?

Android 如何将字符串数据从服务传递到片段?,android,android-fragments,service,timer,Android,Android Fragments,Service,Timer,我有一个在后台运行计时器的服务,我希望数据被传递到我的片段,以便在那里显示计时器。如果我关闭我的应用程序并再次打开它,我希望看到我的编辑文本以显示计时器。如有任何答复,将不胜感激 这是我的服务 public class MyService extends Service { private Vibrator v; //private static Timer timer = new Timer(); NotificationCompat.Builder notifica

我有一个在后台运行计时器的服务,我希望数据被传递到我的片段,以便在那里显示计时器。如果我关闭我的应用程序并再次打开它,我希望看到我的编辑文本以显示计时器。如有任何答复,将不胜感激

这是我的服务

public class MyService extends Service {

    private Vibrator v;
    //private static Timer timer = new Timer();
    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);
            }

            @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();
    }

    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());
    }

}
这是片段。我计划删除这个片段上的倒计时,因为我将在服务上使用计时器

public class page2 extends Fragment {
    private static final String TAG =   "page2";

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

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.page2_fragment,container,false);

        btntest = (Button) view.findViewById(R.id.button2);
        timer = (TextView) view.findViewById(R.id.Timer);
        tv = (TextView) view.findViewById(R.id.textView3);

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

    //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 = getActivity().getSharedPreferences("Timer", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putInt("duration", d);
        editor.apply();
        Intent intent = new Intent(getActivity(),MyService.class);
        getActivity().startService(intent);
        Toast.makeText(getActivity(), "Intent passed and preferences saved!"+d,Toast.LENGTH_SHORT).show();
    }

}
公共类page2扩展了片段{
私有静态最终字符串TAG=“page2”;
私人按钮测试;
私人文本视图定时器,电视;
私人纺纱机纺纱机,纺纱机2;
公共整数小时,分钟,持续时间;
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.page2_碎片,容器,错误);
btntest=(按钮)view.findViewById(R.id.button2);
timer=(TextView)view.findViewById(R.id.timer);
tv=(TextView)view.findViewById(R.id.textView3);
//设置2个纺纱机
微调器=(微调器)视图.findViewById(R.id.spinner1);
字符串[]值={“00”、“01”、“02”、“03”、“04”、“05”、“06”};
ArrayAdapter=新的ArrayAdapter(this.getActivity(),android.R.layout.simple\u微调器\u项,值);
adapter.setDropDownViewResource(android.R.layout.simple\u dropdown\u item\u 1line);
旋转器。设置适配器(适配器);
spinner2=(Spinner)view.findViewById(R.id.spinner2);
字符串[]值2={“00”、“01”、“10”、“20”、“30”、“40”、“50”、“60”};
ArrayAdapter adapter2=新的ArrayAdapter(this.getActivity(),android.R.layout.simple\u微调器\u项,值2);
adapter2.setDropDownViewResource(android.R.layout.simple\u dropdown\u item\u 1line);
喷丝头2.设置适配器(适配器2);
//按钮启动
btntest.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
字符串spin=spinner.getSelectedItem().toString();
小时=整数.parseInt(自旋);
小时=小时*3600000;
String spin2=spinner2.getSelectedItem().toString();
mins=Integer.parseInt(spin2);
分钟=分钟*60000;
持续时间=小时+分钟;
setParam(持续时间);
startService(持续时间);
}
});
返回视图;
}
//定时器部件
公共void setParam(int param){
CountDownTimer CountDownTimer=新的CountDownTimer(参数,1000){
@凌驾
公共void onTick(长参数){
长密度=参数;
String hms=String.format(“%02d:%02d:%02d”,
时间单位。毫秒。至小时(毫秒),
TimeUnit.millides.toMinutes(毫秒)-TimeUnit.HOURS.toMinutes(TimeUnit.millides.toHours(毫秒))
//秒
,TimeUnit.millizes.toSeconds(毫秒)-TimeUnit.MINUTES.toSeconds(TimeUnit.millizes.toMinutes(毫秒))
);
timer.setText(hms);
}
@凌驾
公共无效onFinish(){
timer.setText(“00:00”);
}
};
countDownTimer.start();
}
//保存数据并将意图传递给服务
公共无效startService(整数持续时间)
{
int d=持续时间;
SharedReferences SharedReferences=getActivity().GetSharedReferences(“Timer”,Context.MODE\u PRIVATE);
SharedReferences.Editor=SharedReferences.edit();
编辑:putInt(“持续时间”,d);
editor.apply();
Intent Intent=新的Intent(getActivity(),MyService.class);
getActivity().startService(intent);
Toast.makeText(getActivity(),“传递了意图并保存了首选项!”+d,Toast.LENGTH\u SHORT.show();
}
}

提前感谢。

尝试使用EventBus库,您可以将消息作为普通或固定事件发送,也许它可以解决您的问题:)

在您的情况下,有许多方法可以更新editText

  • 打开应用程序时,可以绑定到已经运行的服务。绑定后,您可以调用服务中的方法以获得结果。有关简单绑定服务,请参阅
  • 您可以保留共享首选项,并在每次倒计时时继续更新它。每当应用程序打开时,请阅读共享首选项并更新您的编辑文本
    尽可能多的我不想使用图书馆。但是谢谢!或者您可以使用BroadcastReceiver,onBind用于连接您的活动和服务,有很多方法可以实现您的目标。您可以使用BroadcastReceiver将数据发送到fragment