2011-12-24 32 views
7

Tôi đang sử dụng ứng dụng AutoStart đơn giản với việc triển khai TimerTask hoạt động tốt ở hầu hết các thiết bị. Vấn đề là nó không hoạt động trong Samsung Galaxy Y(2.3.6)DELL XCD35(2.2). Khi thiết bị khởi động TimerTask hoạt động trong vài giây và sau đó tắt. Tôi kiểm tra trong số Application->Manage Application, tôi thấy rằng Applcation đã ở trạng thái Force Stop. Điều đó có nghĩa là một số ứng dụng của tôi bị ngừng sau một vài giây. Vì vậy, lý do cho điều này là weird behaviour trong hai thiết bị này, nếu có ai có giải pháp chia sẻ nó.Ứng dụng AutoStart không hoạt động bình thường

Dưới đây là mã của tôi.

MyReceiver.java

public class MyReceiver extends BroadcastReceiver{ 

    private Timer mTimer = new Timer(); 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
     Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show(); 
     Log.d("TAG","Device Booted"); 
     mTimer.scheduleAtFixedRate(new MyTimerTask(), 2000,2000); 
    } 

    private class MyTimerTask extends TimerTask 
    { 
     @Override 
     public void run() { 
      Log.d("TAG","TimerTask executed...."); 
     } 
    } 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.autostart.app" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <receiver android:name=".MyReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 
+0

Ah !!! bất kỳ lý do gì về bỏ phiếu xuống? –

+3

Câu hỏi có định dạng hợp lệ, không cần bỏ phiếu xuống ... – WarrenFaith

Trả lời

0

Tôi nghĩ rằng một số trong số AndroidOS đôi khi hệ điều hành giết chết các chuỗi đang chạy trong khi DevicesBoots mà Android không quen thuộc hoặc không nhận ra nó. Đây là lý do tại sao TimerTask hoạt động trong một số Thiết bị và trong một số Thiết bị chỉ hoạt động trong 5-10 giây và sau đó Ứng dụng là ForceStoppedautomatically bởi hệ điều hành Android trên DeviceBoot (Lưu ý - Buộc dừng từ Quản lý ứng dụng chứ không phải Buộc đóng cửa vì vậy tôi không nhận được bất kỳ lỗi nào trong Logcat).

Vì vậy, trong trường hợp đó, giải pháp là sử dụng inbuiltMechanismAndroidOS nhận ra và không giết và giữ nó ở chế độ đang chạy. Trong trường hợp này, tôi quản lý bằng cách sử dụng AlarmManager để thực hiện nhiệm vụ của mình và nó hoạt động.

Tôi có thể không đúng nhưng giải pháp cuối cùng của tôi là sử dụng AlarmManager để làm cho Ứng dụng của tôi hoạt động trong mọi Thiết bị.

@Override 
    public void onReceive(Context context, Intent arg1) { 

     Intent myIntent = new Intent(context, AlarmService.class); 
     PendingIntent pendingIntent = PendingIntent. 
             getService(context, 0, myIntent, 0); 
     AlarmManager alarmManager = (AlarmManager) context 
            .getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
         System.currentTimeMillis() + 2000, 2000, pendingIntent); 
    } 

UPDATE:

AlaramManager is critical system service that runs all the time.

2

tôi sẽ đề nghị bạn sử dụng AlarmManager thay vì TimerTask, như tôi đã phải đối mặt với vấn đề tương tự như bạn mô tả trong nhiều thiết bị .

public void onReceive(Context context, Intent arg1) { 
    Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show(); 
    Log.d("TAG","Device Booted"); 
AlarmManager AM =(AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(); 
    intent.setAction("ALARM_MANAGER_ACTION");//can add any string action here 
    PendingIntent pi = PendingIntent.getBroadcast(mContext 
             .getApplicationContext(), 0, intent,0); 
AM.set(AlarmManager.RTC,selectedTime, pi); 
AM.setRepeating(AM.RTC_WAKEUP, System.currentTimeMillis()+2000, 2000, pi); 
    } 


    public class MyReceiver1 extends BroadcastReceiver{ 
    //event will come here 
    private Timer mTimer = new Timer(); 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
// check if event is same as you broadcasted through alarmManager 
    Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show(); 
    Log.d("TAG","TimerTask executed...."); 

} 

thêm bộ thu phát sóng vào ứng dụng của bạn, nên nghe hành động ("ALARM_MANAGER_ACTION"). và thêm hành động này vào tệp kê khai. Tôi đặt cược nó cũng sẽ hoạt động ở hai thiết bị này.

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