2013-05-05 2 views
7

Что я хочу сделать в своем приложении: 1. Когда пользователь откроет приложение, он сможет увидеть уже запущенный таймер обратного отсчета. Поэтому в этом случае я хочу показать номера обратного отсчета в текстовом виде, которое будет всегда обновляться каждую секунду. 2. Пользователь сможет остановить его. 3. Пользователь может покинуть приложение, но обратный отсчет должен продолжаться и показывать обновленное время, когда он возвращается к пользовательскому интерфейсу приложения.Реализация таймера обратного отсчета с использованием службы в фоновом режиме

Так что, основываясь на вышеуказанных пунктах, я понимаю, что мне нужно реализовать Службу, которая работает в фоновом режиме. Я прочитал ссылку this, но моя проблема связана с реализацией. Я совершенно не понимаю, как это реализовать. При этом я также не могу придумать способ показать время в пользовательском интерфейсе, как только пользователь вернется в приложение. Я также видел this link, но я не уверен, что только реализация CountDownTimer делает его работающей службой. Итак, как мне его продолжить и реализовать? Любые ссылки на конкретные учебники/коды приветствуются. Благодарю.

ОБНОВЛЕНИЕ: Я до сих пор был в состоянии сделать следующее: MainActivity.java

public class MainActivity extends Activity { 

Button btnStart,btnStop; 
Intent serviceIntent; 
TextView tv; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnStart = (Button) findViewById(R.id.btnStart); 
    btnStop = (Button) findViewById(R.id.btnStop); 
    tv = (TextView) findViewById(R.id.timeView); 

    //final MyCounter timer = new MyCounter(100000,1000); 
    //tv.setText("100"); 
    //timer.start(); 
    serviceIntent = new Intent(MainActivity.this,MyService.class); 

    btnStart.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      startService(serviceIntent); 
     } 
    }); 

    btnStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      stopService(serviceIntent); 
     } 
    }); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

MyService.java:

public class MyService extends Service { 

MyCounter timer; 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    timer = new MyCounter(100000,1000); 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    timer.start(); 
    return super.onStartCommand(intent, flags, startId); 
} 
private class MyCounter extends CountDownTimer{ 

    public MyCounter(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 
    } 

    @Override 
    public void onFinish() { 
     Toast.makeText(getApplicationContext(), "death", Toast.LENGTH_LONG).show(); 
     stopSelf(); 
    } 

    @Override 
    public void onTick(long millisUntilFinished) { 

     Toast.makeText(getApplicationContext(), (millisUntilFinished/1000)+"", Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    timer.cancel(); 
    //stopSelf(); 
    super.onDestroy(); 

} 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

    } 

Проблема заключается в том: 1. Я не знать, как показать обратный отсчет на MainActivity UI, кроме этого Тоста. 2. Он не прекращает отсчет, когда я нажимаю кнопку «Стоп».

+0

Я думаю, что вы можете использовать трансляцию в сообщении, это поможет вам. –

+0

@GhalebKhaled, не могли бы вы объяснить о реализации? Я видел учебник из vogella http://www.vogella.com/articles/AndroidServices/article.html и не мог помочь себе понять, как вызываются широковещательные приемники. – Arefin

+0

проверить http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html и http://www.edureka.in/blog/android-tutorials-broadcast-receivers/, надеясь, что это поможет вам –

ответ

1

use bindService (Intent service, ServiceConnection conn, int flag), чтобы связать вашу службу обратного отсчета, а затем в вашей службе вернуть ваше связующее, которое содержит ваш счет, а в вашей деятельности экземпляр объекта ServiceConnection может обрабатывать связующее. AIDL также может это сделать, предложите взглянуть на то, как связать услугу во-первых, желание может вам помочь.

демо

public class BindService extends Service{ 
private int count; 
private boolean quit; 
private MyBinder binder = new MyBinder(); 
// My Binder 
public class MyBinder extends Binder 
{ 
    public int getCount() 
    { 
     // get the counting status:count 
     return count; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) 
{ 
    System.out.println("Service is Binded"); 
    // return the binder instance 
    return binder; 
} 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    System.out.println("Service is Created"); 
    // counting work 
    new Thread() 
    { 
     @Override 
     public void run() 
     { 
      while (!quit) 
      { 
       try 
       { 
        Thread.sleep(1000); 
       } 
       catch (InterruptedException e) 
       { 
       } 
       count++; 
      } 
     } 
    }.start();  
} 
// invoke when the service unbind 
@Override 
public boolean onUnbind(Intent intent) 
{ 
    System.out.println("Service is Unbinded"); 
    return true; 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    this.quit = true; 
    System.out.println("Service is Destroyed"); 
} 

@Override 
public void onRebind(Intent intent) 
{ 
    super.onRebind(intent); 
    this.quit = true; 
    System.out.println("Service is ReBinded"); 
} 

}

, а затем активность

public class MainActivity extends Activity{ 
Button bind , unbind , getServiceStatus; 
BindService.MyBinder binder; 
// define a ServiceConnection object 
private ServiceConnection conn = new ServiceConnection() 
{ 
    // then the Activity connected with the Service, this will be called 
    @Override 
    public void onServiceConnected(ComponentName name 
     , IBinder service) 
    { 
     System.out.println("--Service Connected--"); 
     // achieve MyBinder instance 
     binder = (BindService.MyBinder) service; 
    } 
    // then the connection break off 
    @Override 
    public void onServiceDisconnected(ComponentName name) 
    { 
     System.out.println("--Service Disconnected--");   
    } 
}; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    bind = (Button) findViewById(R.id.bind); 
    unbind = (Button) findViewById(R.id.unbind); 
    getServiceStatus = (Button) findViewById(R.id.getServiceStatus); 

    final Intent intent = new Intent(); 

    intent.setAction("org.crazyit.service.BIND_SERVICE");  
    bind.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View source) 
     { 
      //bind Serivce 
      bindService(intent , conn , Service.BIND_AUTO_CREATE); 
     } 
    }); 
    unbind.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View source) 
     { 
      //unbind Serivce 
      unbindService(conn); 
     } 
    }); 
    getServiceStatus.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View source) 
     { 
      // Toast to show the conut value 
      Toast.makeText(MainActivity.this 
       , "Serivce's count value is:" + binder.getCount() 
       , 4000) 
       .show(); 
     } 
    }); 
}} 
+0

попробовал использовать bindService. Дело в том, что я новичок в Android и вещах не всегда понятны, когда дело доходит до реализации. не могли бы вы прояснить это еще немного, указав его в коде? – Arefin

+0

ОК, вот моя демонстрация, я отредактирую свой ответ, чтобы показать вам. – 3h3

+0

Когда я нажимаю кнопку статуса сервиса, приложение вылетает :( – Arefin

Смежные вопросы