2011-12-24 28 views
7

मेरे पास AutoStartTimerTask कार्यान्वयन के साथ आवेदन है, जो लगभग कई उपकरणों में ठीक काम करता है। समस्या यह है कि यह Samsung Galaxy Y(2.3.6) और DELL XCD35(2.2) में काम नहीं कर रहा है। जब डिवाइस TimerTask बूट करता है तो कुछ सेकंड के लिए काम करता है और फिर बंद हो जाता है। मैं Application->Manage Application में चेक करता हूं, मैंने देखा कि एप्लाकेशन पहले से ही Force Stop राज्य में था। इसका मतलब है कि कुछ सेकंड के बाद मेरा एप्लिकेशन कैसे बंद हो जाता है। तो, इन दो उपकरणों में weird behaviour का कारण क्या है, अगर किसी के पास समाधान है तो इसे साझा करें।ऑटोस्टार्ट एप्लिकेशन ठीक से काम नहीं कर रहा है

नीचे मेरा कोड है।

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

आह !!! वोट के बारे में कोई कारण? –

+3

एक मान्य, अच्छा प्रारूपित प्रश्न, नीचे वोट की आवश्यकता नहीं है ... – WarrenFaith

उत्तर

0

मैं AndroidOS में से कुछ में लगता है कि कभी कभी ओएस धागे चलाने वाले को मारता है, जबकि DevicesBoots जो एंड्रॉयड से परिचित नहीं है या यह नहीं पहचानता है। इसके बल स्टॉप से ​​प्रबंधित आवेदन और नहीं - यही वजह है कि TimerTask कुछ उपकरणों में काम कर रहा है और कुछ उपकरणों में सिर्फ एक 5-10 सेकंड के लिए काम करता है और उसके बाद आवेदन पर DeviceBoot (नोट Android ओएस द्वारा ForceStoppedautomatically है बंद करें इसलिए मुझे लॉगकैट में कोई त्रुटि नहीं मिल रही है)।

तो उस मामले में समाधान का उपयोग करने के लिए है inbuiltMechanism जो AndroidOS पहचानता है और यह मारने नहीं करता है और चल रहे एक मोड में रहता है। इस मामले में मैंने अपना काम करने के लिए AlarmManager का उपयोग करके प्रबंधित किया और यह काम करता है।

मैं सही नहीं हो सकता लेकिन मेरा अंतिम समाधान AlarmManager का उपयोग करना था ताकि मेरा एप्लिकेशन हर डिवाइस में काम कर सके।

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

अद्यतन:

AlaramManager is critical system service that runs all the time.

2

मैं तुम्हें TimerTask के बजाय AlarmManager उपयोग करने के लिए, जैसा कि मैंने एक ही समस्या आप कई उपकरणों में वर्णित का सामना करना पड़ा सुझाव देगा ।

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...."); 

} 

अपने ऐप्लिकेशन में प्रसारण रिसीवर जोड़ने के लिए, जो ("ALARM_MANAGER_ACTION") कार्रवाई सुनने चाहिए। और इस क्रिया को मैनिफेस्ट फ़ाइल में जोड़ें। मुझे यकीन है कि यह इन दो उपकरणों में भी काम करेगा।

संबंधित मुद्दे