2017-02-10 79 views
0

当屏幕关闭和屏幕显示时,我正在获取时间。无法计算时差?

我在“text1”中关闭时间。 ,并在“text2”屏幕上显示时间。 现在我想计算屏幕关闭和屏幕之间的时间差。

无法计算时差。

我想在“text3”中显示时间差。

MainActivity.java

import android.app.Activity; 
    import android.content.BroadcastReceiver; 
    import android.content.Intent; 
    import android.content.IntentFilter; 
    import android.os.Bundle; 
    import android.text.format.DateFormat; 
    import android.util.Log; 
    import android.widget.TextView; 

    import java.text.SimpleDateFormat; 
    import java.util.Calendar; 
    import java.util.Date; 
    import java.util.Timer; 
    import java.util.TimerTask; 

    public class MainActivity extends Activity { 
     TextView text1,text2,text3; 
     Date Date1,Date2; 

     Date d,d1; 
    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     text1 = (TextView) findViewById(R.id.text1); 
     text2 = (TextView) findViewById(R.id.text2); 
     text3 =(TextView) findViewById(R.id.text3); 
     Timer updateTimer = new Timer(); 
     updateTimer.schedule(new TimerTask() 
     { 
      public void run() 
      { 
       try 
       { 
        String string1 = "s"; 
        Date time1 = new SimpleDateFormat("HH:mm:ss ").parse(string1); 
        Calendar calendar1 = Calendar.getInstance(); 
        calendar1.setTime(time1); 

        String string2 = "s1"; 
        Date time2 = new SimpleDateFormat("HH:mm:ss ").parse(string2); 
        Calendar calendar2 = Calendar.getInstance(); 
        calendar2.setTime(time2); 
        calendar2.add(Calendar.DATE, 1); 

        Date x = calendar1.getTime(); 
        Date xy = calendar2.getTime(); 

        long diff = x.getTime() - xy.getTime(); 

        int Hours = (int) (diff/( 60 * 60)); 
        int Mins = (int) (diff/(60)) % 60; 


        //System.out.println("diff hours" + diffHours); 
        String diff1 = Hours + ":" + Mins; // updated value every1 second 
        text3.setText(diff1); 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 

     }, 0, 1000); 

      // INITIALIZE RECEIVER 
      IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
      filter.addAction(Intent.ACTION_SCREEN_OFF); 
      BroadcastReceiver mReceiver = new ScreeReceiver(); 
      registerReceiver(mReceiver, filter); 

      // YOUR CODE 
     } 

     @Override 
     protected void onPause() { 
      // WHEN THE SCREEN IS ABOUT TO TURN OFF 
      if (ScreeReceiver.wasScreenOn) { 
       // THIS IS THE CASE WHEN ONPAUSE() IS CALLED BY THE SYSTEM DUE TO A SCREEN STATE CHANGE 
       d = new Date(); 
       CharSequence s = DateFormat.format("hh:mm:ss", d.getTime()); 

       // d=format.parse(d); 
       // s=d.getTime(); 

    ///Log.i(""+s); 
       System.out.println("SCREEN TURNED OFF"); 
       text1.setText("SCREEN TURNED OFF" + s); 
       Log.i("hi", "s"+s); 
       //System.out.println("s"); 

      } else { 
       // THIS IS WHEN ONPAUSE() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED 
      } 
      super.onPause(); 
     } 

     @Override 
     protected void onResume() { 
      // ONLY WHEN SCREEN TURNS ON 
      if (!ScreeReceiver.wasScreenOn) { 
       // THIS IS WHEN ONRESUME() IS CALLED DUE TO A SCREEN STATE CHANGE 

       d1 = new Date(); 
       CharSequence s1 = DateFormat.format("hh:mm:ss", d1.getTime()); 
       text2.setText("SCREEN TURNED ON" + s1); 
       Log.i("hi", "s"+s1); 
       // System.out.println("s"); 
       System.out.println("SCREEN TURNED ON"); 
      } else { 
      } 
      super.onResume(); 
     } 

    } 

ScreenReceiver.java

public class ScreeReceiver extends BroadcastReceiver { 


    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      // DO WHATEVER YOU NEED TO DO HERE 
      wasScreenOn = false; 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      // AND DO WHATEVER YOU NEED TO DO HERE 
      wasScreenOn = true; 
     } 
    } 

} 
+0

你可以有限制自己的代码计算的差异的部分。 – AxelH

回答

0

附加图像中对此我开/关时间获取画面。和它们之间的时间差。

enter image description here

public class MainActivity extends Activity { 
    TextView text1,text2,text3; 


    Date d,d1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     text1 = (TextView) findViewById(R.id.text1); 
     text2 = (TextView) findViewById(R.id.text2); 
     text3 =(TextView) findViewById(R.id.text3); 


     // INITIALIZE RECEIVER 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreeReceiver(); 
     registerReceiver(mReceiver, filter); 

     // YOUR CODE 
    } 

    @Override 
    protected void onPause() { 
     // WHEN THE SCREEN IS ABOUT TO TURN OFF 
     if (ScreeReceiver.wasScreenOn) { 
      // THIS IS THE CASE WHEN ONPAUSE() IS CALLED BY THE SYSTEM DUE TO A SCREEN STATE CHANGE 

      d = new Date(); 
      CharSequence s = DateFormat.format("hh:mm:ss", d.getTime()); 

      System.out.println("SCREEN TURNED OFF"); 
      text1.setText("SCREEN TURNED OFF" + s); 
      Log.i("hi", "s"+ s); 


     } else { 
      // THIS IS WHEN ONPAUSE() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED 
     } 
     super.onPause(); 


    } 

    @Override 
    protected void onResume() { 
     // ONLY WHEN SCREEN TURNS ON 
     if (!ScreeReceiver.wasScreenOn) { 
      // THIS IS WHEN ONRESUME() IS CALLED DUE TO A SCREEN STATE CHANGE 

      d1 = new Date(); 
      CharSequence s1 = DateFormat.format("hh:mm:ss", d1.getTime()); 

      text2.setText("SCREEN TURNED ON" + s1); 
      Log.i("hi", "s"+ s1); 

      System.out.println("SCREEN TURNED ON"); 

      Timer updateTimer = new Timer(); 
      updateTimer.schedule(new TimerTask() 
      { 

       public void run() 
       { 
        try 
        { 

         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 

           //stuff that updates ui 
           long diff = d1.getTime() - d.getTime(); 

           int Hours = (int) (diff/(1000* 60 * 60)); 
           int Mins = (int) (diff/(1000*60)) % 60; 

           Log.i("Difference ", ""+ diff); 

           String diff1= Hours + ":" + Mins; // updated value every 60 second 
           text3.setText(diff1); 
           Log.i("Differ", "diff"+ diff1); 
          } 
         }); 

        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 
       } 

      }, 0, 600000); 

     } else { 
     } 
     super.onResume(); 


    } 

} 
1

1:

String string1 = "s"; 

不能被解析为一个日期。你为什么不使用你存储的d和d1字段?

long diff = d1.getTime() - d.getTime(); 

2:

公共长的getTime()返回自一月 1,1970年,由该日期对象表示00:00:00 GMT的毫秒数。

(加粗我的重点)

您计算时间差,好像它是在几秒钟。

尝试:

int Hours = (int) (diff/( 60 * 60 * 1000)); 
int Mins = (int) (diff/(60 * 1000)) % 60; 
+0

我没有得到你的答案。 – user6313669

+0

@ user6313669'int Hours =(int)(diff /(60 * 60));'',你正在将'dif'设置为秒数,但是是毫秒int hours =(int)(diff/60/60/1000);' – AxelH

+0

@reden试过这个,但没有得到区别.in日志我得到这个 java.text.ParseException:Unparseable date:“s” – user6313669