2016-11-21 19 views
5

Tôi có Cơ sở dữ liệu mà tôi cần xóa vào một ngày nhất định, làm cách nào để tôi có thể thực hiện tác vụ này? Tôi đã tìm thấy điều này:cách lên lịch tác vụ trên android

timer = new Timer(); 

timer.scheduleAtFixedRate(new TimerTask() { 

    synchronized public void run() { 

     \\ here your todo; 
     } 

    }}, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1)); 

Nhưng tôi không chắc liệu nó có "lưu tác vụ" cho đến ngày hết hạn hay không. Cảm ơn

+0

Câu trả lời trong [liên kết này] (http://stackoverflow.com/a/8801990/3800164) sẽ giúp bạn lên lịch nhiệm vụ trong tương lai. –

+0

Sự hiểu biết của tôi là nếu ứng dụng của bạn đã thoát _before_ tác vụ được sinh ra, thì không, nó sẽ không thực thi. Nếu ứng dụng của bạn cố gắng thoát _while_ tác vụ đang chạy, thì hệ điều hành có thể chặn nó. Câu trả lời dưới đây bởi @jitesh có thể là những gì bạn đang tìm kiếm. –

Trả lời

1

Lớp AlarmManager cho phép lập lịch trình của báo động lặp đi lặp lại rằng sẽ chạy tại các điểm được thiết lập trong tương lai. AlarmManager được cấp PendingIntent để kích hoạt bất cứ khi nào báo thức được lên lịch. Khi báo động được kích hoạt , Mục đích đã đăng ký được phát sóng bởi hệ thống Android, bắt đầu ứng dụng đích nếu ứng dụng chưa chạy.

Tạo lớp kế thừa từ BroadcastReceiver. Trong phương thức onReceive, được gọi khi BroadcastReceiver nhận được Intent broadcast, chúng ta sẽ thiết lập mã chạy nhiệm vụ của chúng ta.

AlarmReceiver.java

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.Toast; 

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     // For our recurring task, we'll just display a message 
     Toast.makeText(arg0, "I'm running", Toast.LENGTH_SHORT).show(); 

    } 

} 

Sau đó chúng tôi cần phải đăng ký BroadcastReceiver trong file manifest. Khai báo AlarmReceiver trong tệp kê khai.

<application> 
    . 
    . 
    <receiver android:name=".AlarmReceiver"></receiver> 
    . 
    . 
</application> 

Trong hoạt động gọi điện của bạn bao gồm các biến mẫu sau.

private PendingIntent pendingIntent; 
private AlarmManager manager; 

Trong onCreate(), chúng tôi tạo Intent tham chiếu lớp thu phát sóng và sử dụng nó trong PendingIntent.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Retrieve a PendingIntent that will perform a broadcast 
    Intent alarmIntent = new Intent(this, AlarmReceiver.class); 
    pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); 
} 

Sau đó, chúng tôi sẽ bao gồm phương pháp sẽ thiết lập báo thức định kỳ. Sau khi cài đặt, báo thức sẽ kích hoạt sau mỗi lần X, ở đây chúng tôi lấy 10 giây ví dụ bạn có thể tính toán đơn giản này để kích hoạt nó mỗi ngày.

public void startAlarm(View view) { 
    manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    int interval = 10000; 

    manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 
    Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show(); 
} 

Tiếp theo, chúng tôi cũng sẽ thiết lập phương thức cancelAlarm() để ngừng báo thức, nếu cần.

public void cancelAlarm(View view) { 
    if (manager != null) { 
     manager.cancel(pendingIntent); 
     Toast.makeText(this, "Alarm Canceled", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

Xin chào, tôi đang sử dụng Cơ sở dữ liệu Realm, nhưng tôi cần phải vượt qua một Ngữ cảnh là một' Hoạt động', làm thế nào tôi có thể vượt qua điều này của 'onReceive'? cảm ơn –

+0

Nó không hoạt động ... "Không thể giải quyết hàm khởi tạo Ý định" 'Intent alarm = new Intent (this, AlarmReceiver.class);' –

2

Để thực hiện việc này, bạn cần sử dụng Trình quản lý Alaram sẽ kích hoạt sau một thời gian cụ thể.

Trước tiên, bạn cần phải khai báo thu phát sóng những người sẽ nhận được những alaram

public class DBActionReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     // perform delete operation here 
    } 

} 

Thứ hai, Bây giờ đăng ký alaram quản lý

AlarmManager alarms = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); 

    DBActionReceiver receiver = new DBActionReceiver(); 
    IntentFilter filter = new IntentFilter("ALARM_ACTION"); 
    registerReceiver(receiver, filter); 

    Intent intent = new Intent("ALARM_ACTION"); 
    intent.putExtra("param", "My scheduled action"); 
    PendingIntent operation = PendingIntent.getBroadcast(this, 0, intent, 0); 
    // invoke broadcast after one minute of my app launch 
    alarms.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(1000 * 60), operation) ; 
+0

xin vui lòng cho tôi biết nếu ở trên cho ans không làm việc cho bạn –

+0

bạn có thể vui lòng chấp nhận câu trả lời của tôi. –

+0

Nó cũng không hoạt động!'getSystemService' không tồn tại –

Các vấn đề liên quan