Best practice for changing min SDK

by Warren » Tue, 03 Aug 2010 01:23:38 GMT


Sponsored Links
 I have a sizable install base already on some apps with Android 1.5
set as the minimum version.  I want to update the apps to take
advantage of some of the newer features offered in Android 2.0 and
greater. What is the best way forward so I don't break things for my
current 1.5 and 1.6 users?

If I simply update the application with a new min SDK version, will
1.5 and 1.6 users be prompted to uninstall? Or will they just not see
the update?

What about future development that I want to apply for everyone, say a
bugfix. Will I have painted myself into a corner?

Another solution would be to fork and create a new app for 2.0 users,
but that is undesirable for several reasons.

This must be a somewhat common problem. Have you seen any good ways to
handle it?

Warren

--



Best practice for changing min SDK

by TreKing » Tue, 03 Aug 2010 01:43:25 GMT


 



Use reflection or check the build version to determine if you can use newer
APIs.



I assume they will not see the update. There's no reason to do this though.



Not if you do it correctly.



Yeah, don't do that.



Repeat: use reflection or check the build version to determine if you can
use newer APIs.

There's a blog post on this subject. Go find it =)

-------------------------------------------------------------------------------------------------
TreKing < http://sites.google.com/site/rezmobileapps/treking> ; - Chicago
transit tracking app for Android-powered devices

--


Sponsored Links


Best practice for changing min SDK

by Warren » Tue, 03 Aug 2010 04:55:34 GMT


 Thanks.

I found this post for others who are looking:

 http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html 

Warren







--



Re: Best practice for changing min SDK

by Robert Massaioli » Wed, 16 Mar 2011 08:15:35 GMT


 >

Just out of interest though does anybody know what would happen if you just 
did this anyway? What happens when you bump the min SDK version up?

Thanks,
Robert 

-- 



Re: Best practice for changing min SDK

by TreKing » Wed, 16 Mar 2011 08:53:29 GMT


 On Tue, Mar 15, 2011 at 7:15 PM, Robert Massaioli <robertmassai...@gmail.com





AFAIK, your app disappears from the Market for those people that don't have
the right OS version, though they keep the app. They cannot update and if
they uninstall, they cannot redownload the app. Tread carefully.

-------------------------------------------------------------------------------------------------
TreKing < http://sites.google.com/site/rezmobileapps/treking> ; - Chicago
transit tracking app for Android-powered devices

-- 



Re: Best practice for changing min SDK

by Robert Massaioli » Wed, 16 Mar 2011 09:03:18 GMT


 Thanks for the response. That makes sense, in that case I was considering 
releasing my app so that it supported version 3 of the SDK because that 
would be easy to do, however I really want the android.accounts package so 
maybe I will just make the min SDK level be 5 and ignore those on old 
phones. (And then I don't have to do that backwards compatibility reflection 
mess to get the android.accounts package)

They only make up a really small segment of the market anyway: 
 http://developer.android.com/resources/dashboard/platform-versions.html 

Thanks,
Robert

-- 



Re: Best practice for changing min SDK

by TreKing » Wed, 16 Mar 2011 09:18:38 GMT


 On Tue, Mar 15, 2011 at 8:03 PM, Robert Massaioli <robertmassai...@gmail.com




That says 3.0%. The new Developer Console stats say 5.1%. Personally, I
wouldn't trust either since they come from the Market app which has proven
to be completely unreliable in reporting these statistics. Add your own
analytics if you can and base your decision on that.

-------------------------------------------------------------------------------------------------
TreKing < http://sites.google.com/site/rezmobileapps/treking> ; - Chicago
transit tracking app for Android-powered devices

-- 



Re: Best practice for changing min SDK

by Robert Massaioli » Wed, 16 Mar 2011 09:34:11 GMT


 Well that is annoying, cannot even trust the statistics pages. Now I 
actually have to debate what to do. Not as fun as I was planning. Ah well, I 
guess that is the price that people pay for newer and better versions of 
Android. Though Google really needs to get ontop of those statistics then; I 
hope they are working on that now.

Thanks for letting me know though. Actually...can you please post the 
statistics that the developer console gives you for device distribution? I 
don't have an account yet or an app online and I would really appreciate it.

Thanks again,
Robert

-- 



Re: Best practice for changing min SDK

by TreKing » Wed, 16 Mar 2011 10:17:47 GMT


 On Tue, Mar 15, 2011 at 8:34 PM, Robert Massaioli <robertmassai...@gmail.com





First value is from the console, second from the chart linked, blanks are
not available. 2.1 is the only one that's even remotely close.

Android 3.0 0.2%
Android 2.2    57.1% 61.3%
Android 2.1    29.3% 29.0%
Android 1.6    7.0% 4.8%
Android 1.5    5.1% 3.0%
Android 2.3.3  0.6% 1.0%
Android 2.3    0.2% 0.7%
Android 2.0.1  0.1%
Android 1.1    0.1%
Android 1.0    0.1%
Android 2.0    0.0%

-------------------------------------------------------------------------------------------------
TreKing < http://sites.google.com/site/rezmobileapps/treking> ; - Chicago
transit tracking app for Android-powered devices

-- 



Re: Best practice for changing min SDK

by Robert Massaioli » Wed, 16 Mar 2011 10:43:25 GMT


 Thankyou, these are really useful statistics though it is really confusing 
that they tell different stories. However it does say that everything below 
v7 of the SDK is only about ten percent of the market which I think means 
that app developers will ditch those platforms in the future. (If not right 
now)

-- 



Re: Best practice for changing min SDK

by String » Wed, 16 Mar 2011 15:12:59 GMT


 


everything below v7 of the SDK is only about ten percent of the market which 


I don't know about you, but I'm disinclined to unilaterally chop 10% off my 
sales. After the recent Market ranking shenanigans, they're shaky enough as 
it is.

String 

-- 



Re: Best practice for changing min SDK

by Robert Massaioli » Wed, 16 Mar 2011 19:05:10 GMT


 Actually I made that comment a little flippantly; 10% still translates to a 
whole bunch of users when you are talking about an OS like Android. I have 
changed my mind and I will suffer a little bit of that 
Backwards Compatibility pain in order to cater for every user.

-- 



Re: Best practice for changing min SDK

by lbendlin » Wed, 16 Mar 2011 19:35:20 GMT


 You will have to keep in mind that the 1.5 phones have no chance of
ever being upgraded. So they are there to stay, as long as the owner
thinks they are devcent as a phone (most are). You'll need to support
1.5 for at least another two years. I have my MinSDK set at 3 and use
reflection successfully.

Once you understand that it's not much more than an additional "shell"
that prevents the system from checking if an object is compatible with
the target SDK you'll find reflection pretty easy to use.

On Mar 16, 6:52am, Robert Massaioli <robertmassai...@gmail.com>



-- 



Re: Best practice for changing min SDK

by Lance Nanek » Fri, 18 Mar 2011 02:35:44 GMT


 Isn't the chart a measurement of the phones with Market installed
whereas the console statistics we are talking about are for all apps?
So if Market is installed on one Android 1.5 phone and one Android 2.0
phone, that's 50/50 for the chart. Now if the first phone had 1 app
and the second phone had 3 apps, that would be 25/75 for the console
stats, all apps readout? Just saying the definitions could be
different, thus it would make sense for the numbers to be different.





-- 



Re: Re: Best practice for changing min SDK

by TreKing » Fri, 18 Mar 2011 02:41:02 GMT


 



As usual, the only people that can answer that with any certainty are not
going to, so let's all keep making stuff up.

-------------------------------------------------------------------------------------------------
TreKing < http://sites.google.com/site/rezmobileapps/treking> ; - Chicago
transit tracking app for Android-powered devices

-- 



Other Threads

1. the files created by my aplication are deleted after turn off USB storage

Hi!

   My application have to save some information in some files on sdcard. If
i connect my phone (Htc Hero) at computer ass USB storage after i turn off
USB Storage all my files what are created by my app are deleted. If anyone
have idea why this is happining please help me..

That is my code:

package com.app.liviu.simpleMusciPlayer.playlist;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import android.content.Context;
import android.util.Log;

import com.app.liviu.simpleMusciPlayer.database.DatabaseManager;
import com.app.liviu.simpleMusicPlayer.MainActivity;
import com.app.liviu.simpleMusicPlayer.R;
import com.app.liviu.simpleMusicPlayer.Util.Constants;

public class Playlist implements BasePlaylist
{
    private String                TAG = "Playlist";
    private String                namePlaylist = "unknown";
    private ArrayList<Song>    songsList;
    private String             path;
    private DatabaseManager    dbManager;
    private Context            context;
    private int                imageResId;


    public Playlist(Context ctx)
    {
        context      = ctx;
        songsList      = new ArrayList<Song>();
        dbManager     = new DatabaseManager(context);
        imageResId   = R.drawable.plsimg;
    }

    public Playlist(String playListName,Context ctx)
    {
        context      = ctx;
        songsList      = new ArrayList<Song>();
        dbManager     = new DatabaseManager(context);
        namePlaylist = playListName;
        path          = Constants.PLAYLISTS_DIRECTORY + namePlaylist +
".pls";
        imageResId   = R.drawable.plsimg;

    }

    public void setNamePlaylist(String namePlaylist_)
    {
        namePlaylist = namePlaylist_;
        path         = Constants.PLAYLISTS_DIRECTORY + namePlaylist +
".pls";
    }

    public String getPlaylistName()
    {
        return namePlaylist;
    }

    public void savePlayList()
    {
        File dir = new File(Constants.PLAYLISTS_DIRECTORY);

        if(!dir.exists())
        {
            dir.mkdir();
            //Log.e(TAG, "Am creat directorul!");
        }
        else
            //Log.e(TAG, "directorul exista!");

        try
        {
            FileWriter fstream = new FileWriter(path,false);
            BufferedWriter out = new BufferedWriter(fstream);

            for(int i = 0; i < songsList.size(); i++)
                out.write(Integer.toString(songsList.get(i).getId()) +
"\n");

            out.close();
            fstream.close();

            //Log.e(TAG,"i wrote something in file " + songsList.size());

            }
            catch (Exception e)
            {
              Log.e(TAG,"Error at write " + e.getMessage());
            }
    }


    public boolean loadPlaylist()
    {
        try
        {
            FileInputStream file = new FileInputStream(path);
            DataInputStream in   = new DataInputStream(file);
            BufferedReader  br   = new BufferedReader(new
InputStreamReader(in));
            String strLine;
            songsList = new ArrayList<Song>();

            dbManager.openDatabase();

            while ((strLine = br.readLine()) != null)
            {
              //Log.e(TAG,"i read from file " + strLine);

songsList.add(dbManager.getSongAtIndex(Integer.parseInt(strLine)));
            }

            Log.e(TAG,"playlist " + namePlaylist + " have " +
songsList.size() + " songs!");

            dbManager.closeDatabaseManager();

            if(songsList.size() == 0)
                return false;

            songsList.get(0).setImagePath("//sdcard//test.jpg");
            in.close();
            br.close();


            return true;

        } catch (FileNotFoundException e)
        {
            Log.e(TAG,"error at opening file");
            e.printStackTrace();

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

        return false;
    }

    public boolean addSongToPlaylist(Song s)
    {
        for(int i = 0; i < songsList.size(); i++)
        {
            if(songsList.get(i).getId() == s.getId())
                return false;


        }

        songsList.add(s);
        return true;
    }


    public boolean deleteSongFromPlaylist(Song s)
    {
        if(!songsList.contains(s))
        {
            Log.e(TAG, "The song "  + s.getId() + s.getTitle() +  " do not
exist in playlist");
            return false;
        }
        else
        {
            for(int i = 0; i < songsList.size(); i++)
                if(songsList.get(i).equals(s))
                    {
                        songsList.remove(i);
                        Log.e(TAG,"The song " + s.getId() + s.getTitle() +
"was deleted! " + songsList.size());
                        return true;
                    }
        }

        return false;
    }

    public Song getFirstSongFromPlaylist()
    {
        Log.e(TAG,"First song!");
        Song s = null;
        try
        {
            Log.e(TAG,"First Song have id " + songsList.get(0).getId());
            s = songsList.get(0);
        }
        catch (IndexOutOfBoundsException e)
        {
            Log.e(TAG,"no first song!");
        }

        return s;
    }

    public Song getLastSongFromPlaylist()
    {
        Song s = null;

        try
        {
            Log.e(TAG,"Last song!");
            Log.e(TAG,"Last Song have id " + songsList.get(songsList.size()
-1).toString());
            s = songsList.get(songsList.size() -1);
        }
        catch (IndexOutOfBoundsException e)
        {
            Log.e(TAG,"no Last song!");
        }

        return s;
    }

    //i return -1 if not exists next song

    public Song getNextSongFromPlaylist(int index)
    {
        Log.e(TAG,"Next song!");
        Song s = null;

        try
        {

            Log.e(TAG,"send next song at position " + (index + 1 ) + " with
id " + songsList.get(index+1).toString() );
            s = songsList.get(index + 1);
        }
        catch (IndexOutOfBoundsException e)
        {
            Log.e(TAG, "index out of bounds!");
        }

        return s;


    }

    //i returned null if no previous
    public Song getPreviousSongFromPlaylist(int index)
    {
        Log.e(TAG,"Prev song!");
        Song s = null;

        try
        {
                Log.e(TAG,"send previous song at position " + (index - 1 ) +
" with " + songsList.get(index - 1).toString() );
                s = songsList.get(index - 1);
        }
        catch (IndexOutOfBoundsException e)
        {
            Log.e(TAG, "no prev song");
        }

        return s;
    }

    public Song getSongFromPlaylist(int index)
    {
        Song s = null;

        try
        {
            Log.e(TAG,"its ok..we have the song,it exists in playlist.we
sending it now " + songsList.get(index).toString());
            s = songsList.get(index);
        }
        catch (IndexOutOfBoundsException e)
        {
            Log.e(TAG, "no song at index " + index);
        }

        return s;
    }


    public boolean rateSongInPlaylist(Song s, int rate)
    {
        // TODO Auto-generated method stub
        return false;
    }


    public boolean renameSongInPlaylist(Song s)
    {
        // TODO Auto-generated method stub
        return false;
    }

    public void listPlaylistSongs()
    {
        int i;

        for(i = 0; i < songsList.size(); i++)
            Log.e(TAG,songsList.get(i).toString());
    }

    public ArrayList<Song> getAllSongFiles()
    {
        return songsList;
    }

    public boolean isPlaylistEmpty()
    {
        return songsList.isEmpty();
    }

    public void setPlaylistSongsList(ArrayList<Song> list)
    {
        songsList = list;

        for(int i = 0; i < songsList.size(); i++)

if(songsList.get(i).equals(MainActivity.musicPlayer.getCurrentSong()))
            {
                Log.e(TAG, "am gasit current song " +
songsList.get(i).toString());
                MainActivity.pManager.setSongPosition(i);
            }
    }

    public void setImageResId(int imageResId)
    {
        this.imageResId = imageResId;
    }

    public int getImageResId()
    {
        return imageResId;
    }
}

Thank you!

2. Crashed Service not restarting - !!! FAILED BINDER TRANSACTION !!! - Dianne could you help ?

Hi again,

Our service is still crashing for some reason not related to our
application. To make sure it's not RunTime exception we've used a :
try
{
  // Get WakeLock
  // Perform actions
}
catch (Throwable t)
{
  // log error (if any)
}
finally
{
  // Schedule a new service startup and PendingIntent an AlarmManager
  long tick = 60000L;
  long nextUpdate = System.currentTimeMillis();
  nextUpdate += (tick - nextUpdate % tick);
  Intent updateIntent = new Intent();
  updateIntent.setClass(this, RefreshService.class);
  PendingIntent pendingIntent = PendingIntent.getService(this, 0,
updateIntent, 0);
  AlarmManager alarmManager = (AlarmManager)getSystemService
(Context.ALARM_SERVICE);
  alarmManager.set(AlarmManager.RTC, nextUpdate, pendingIntent);
  // Release WakeLock
  ...
}
stopSelf();

The service is still crashing randomly on real device (Android 1.6/HTC
Magic) and it does not restart. It's not a problem of Taskiller
because it is not installed.
Here are the logs:
01-06 21:18:00.653: INFO/ActivityManager(75): Stopping service:
xx.yy/.widget.RefreshService
01-06 21:18:06.283: DEBUG/dalvikvm(1318): GC freed 4957 objects /
283104 bytes in 110ms
// Problem starts here.
01-06 21:18:59.153: INFO/ActivityManager(75): Process xx.yy(pid 1318)
has died.
01-06 21:21:33.530: INFO/ActivityManager(75): Start proc xx.yyfor
service xx.yy/.widget.RefreshService: pid=1339 uid=10031 gids={3003,
1015}
01-06 21:21:33.720: INFO/dalvikvm(1339): De{*filter*} thread not active,
ignoring DDM send (t=0x41504e4d l=38)
01-06 21:21:33.750: INFO/dalvikvm(1339): De{*filter*} thread not active,
ignoring DDM send (t=0x41504e4d l=48)
01-06 21:21:34.520: INFO/ActivityManager(75): Stopping service:
xx.yy/.widget.RefreshService
01-06 21:23:11.526: ERROR/JavaBinder(75): !!! FAILED BINDER
TRANSACTION !!!
01-06 21:23:11.536: ERROR/JavaBinder(75): !!! FAILED BINDER
TRANSACTION !!!
01-06 21:23:11.635: INFO/ActivityManager(75): Process xx.yy(pid 1339)
has died.
01-06 21:23:11.686: WARN/ActivityManager(75): Scheduling restart of
crashed service xx.yy/.widget.RefreshService in 5000ms
01-06 21:23:16.736: INFO/ActivityManager(75): Start proc xx.yy for
service xx.yy/.widget.RefreshService: pid=1349 uid=10031 gids={3003,
1015}
01-06 21:23:16.825: INFO/dalvikvm(1349): De{*filter*} thread not active,
ignoring DDM send (t=0x41504e4d l=38)
01-06 21:23:16.855: INFO/dalvikvm(1349): De{*filter*} thread not active,
ignoring DDM send (t=0x41504e4d l=48)
// But service never restarts !

We've run the following command according to Dianne advice: "adb shell
dumpsys activity.services" and we can see our service but it is not
executed.

Currently running services:
  activity.services
-------------------------------------------------------------------------------
DUMP OF SERVICE activity.services:
Services in Current Activity Manager State:
  Active services:
  * ServiceRecord{43563d78 xx.yy/.widget.RefreshService}
    intent={cmp=xx.yy/.widget.RefreshService}
    packageName=xx.yy
    processName=xx.uu
    baseDir=/data/app/xx.yy.apk/data/app/xx.yy.apk dataDir=/data/data/
xx.yy
    app=ProcessRecord{4348d8f8 1349:xx.yy/10031}
    isForeground=false lastActivity=-675021
    startRequested=true startId=1 executeNesting=0
executingStart=-675021 crashCount=0
    totalRestartCount=1 restartCount=1 restartDelay=5000
restartTime=-675021 nextRestartTime=-675183

  * ServiceRecord{43471978
com.google.android.location/.NetworkLocationService}
    intent={cmp=com.google.android.location/.NetworkLocationService}
    packageName=com.google.android.location
    processName=system
    baseDir=/system/app/NetworkLocation.apk/system/app/
NetworkLocation.apk dataDir=/data/data/com.google.android.location
    app=ProcessRecord{433869d8 75:system/1000}
    isForeground=false lastActivity=-6811360
    startRequested=true startId=1 executeNesting=0
executingStart=-6811353 crashCount=0
    totalRestartCount=0 restartCount=0 restartDelay=0
restartTime=-6811360 nextRestartTime=-6857706

  * ServiceRecord{43430480
com.google.android.googleapps/.GoogleLoginService}
    intent={cmp=com.google.android.googleapps/.GoogleLoginService}
    packageName=com.google.android.googleapps
    processName=com.google.process.gapps
    baseDir=/system/app/GoogleApps.apk/system/app/GoogleApps.apk
dataDir=/data/data/com.google.android.googleapps
    app=ProcessRecord{4337a268 149:com.google.process.gapps/10015}
    isForeground=false lastActivity=-330241
    startRequested=false startId=0 executeNesting=0
executingStart=-6812034 crashCount=0
    totalRestartCount=0 restartCount=0 restartDelay=0
restartTime=-6816373 nextRestartTime=-6857714

    * IntentBindRecord{4345a4d0}:
      intent={act=android.accounts.IAccountsService
cmp=com.google.android.googleapps/.GoogleLoginService}
      binder=android.os.binderpr...@4345adc8
      requested=true received=true hasBound=false doRebind=false

    * IntentBindRecord{43430848}:
      intent={cmp=com.google.android.googleapps/.GoogleLoginService}
      binder=android.os.binderpr...@43438fa0
      requested=true received=true hasBound=true doRebind=false

      * Client AppBindRecord{43430918 ProcessRecord{4337a268
149:com.google.process.gapps/10015}}
        Per-process Connections:
          ConnectionRecord{43398190
com.google.android.googleapps/.GoogleLoginService:@433a3768}
          ConnectionRecord{433b9908
com.google.android.googleapps/.GoogleLoginService:@433b9878}
          ConnectionRecord{433e7338
com.google.android.googleapps/.GoogleLoginService:@433e2100}

    All Connections:
      ConnectionRecord{433e7338
com.google.android.googleapps/.GoogleLoginService:@433e2100}
      ConnectionRecord{433b9908
com.google.android.googleapps/.GoogleLoginService:@433b9878}
      ConnectionRecord{43398190
com.google.android.googleapps/.GoogleLoginService:@433a3768}

  * ServiceRecord{43340138
com.google.android.server.checkin/.CheckinService}
    intent={cmp=com.google.android.server.checkin/.CheckinService}
    packageName=com.google.android.server.checkin
    processName=system
    baseDir=/system/app/GoogleCheckin.apk/system/app/GoogleCheckin.apk
dataDir=/data/data/com.google.android.server.checkin
    app=ProcessRecord{433869d8 75:system/1000}
    isForeground=false lastActivity=-6827000
    startRequested=true startId=1 executeNesting=0
executingStart=-6826997 crashCount=0
    totalRestartCount=0 restartCount=0 restartDelay=0
restartTime=-6827000 nextRestartTime=-6857736

  * ServiceRecord{4346d038 com.google.android.apps.gtalkservice/
com.google.android.gtalkservice.service.GTalkService}
    intent={cmp=com.google.android.apps.gtalkservice/
com.google.android.gtalkservice.service.GTalkService}
    packageName=com.google.android.apps.gtalkservice
    processName=com.google.process.gapps
 
permission=com.google.android.gtalkservice.permission.GTALK_SERVICE
    baseDir=/system/app/gtalkservice.apk/system/app/gtalkservice.apk
dataDir=/data/data/com.google.android.apps.gtalkservice
    app=ProcessRecord{4337a268 149:com.google.process.gapps/10015}
    isForeground=false lastActivity=-6811451
    startRequested=true startId=1 executeNesting=0
executingStart=-6811446 crashCount=0
    totalRestartCount=0 restartCount=0 restartDelay=0
restartTime=-6811451 nextRestartTime=-6857744

  * ServiceRecord{433c6970 com.android.phone/.BluetoothHeadsetService}
    intent={cmp=com.android.phone/.BluetoothHeadsetService}
    packageName=com.android.phone
    processName=com.android.phone
    baseDir=/system/app/Phone.apk/system/app/Phone.apk dataDir=/data/
data/com.android.phone
    app=ProcessRecord{4335dba0 118:com.android.phone/1001}
    isForeground=false lastActivity=-6822206
    startRequested=true startId=1 executeNesting=0
executingStart=-6006342 crashCount=0
    totalRestartCount=0 restartCount=0 restartDelay=0
restartTime=-6822206 nextRestartTime=-6857753

    * IntentBindRecord{43465dc8}:
      intent={act=android.bluetooth.IBluetoothHeadset}
      binder=android.os.binderpr...@434660d8
      requested=true received=true hasBound=false doRebind=false
      * Client AppBindRecord{434f1f50 ProcessRecord{4335dba0
118:com.android.phone/1001}}
        Per-process Connections:
          ConnectionRecord{434f2020
com.android.phone/.BluetoothHeadsetService:@434f1dd0}

    All Connections:
      ConnectionRecord{434f2020
com.android.phone/.BluetoothHeadsetService:@434f1dd0}

  * ServiceRecord{4323e190 com.android.inputmethod.latin/.LatinIME}
    intent={act=android.view.InputMethod
cmp=com.android.inputmethod.latin/.LatinIME}
    packageName=com.android.inputmethod.latin
    processName=com.android.inputmethod.latin
    permission=android.permission.BIND_INPUT_METHOD
    baseDir=/system/app/LatinIME.apk/system/app/LatinIME.apk dataDir=/
data/data/com.android.inputmethod.latin
    app=ProcessRecord{4342f8f8 285:com.android.inputmethod.latin/
10006}
    isForeground=false lastActivity=-6737471
    startRequested=false startId=0 executeNesting=0
executingStart=-6737464 crashCount=0
    totalRestartCount=0 restartCount=0 restartDelay=0
restartTime=-6737471 nextRestartTime=-6857768

    * IntentBindRecord{433f1c80}:
      intent={act=android.view.InputMethod
cmp=com.android.inputmethod.latin/.LatinIME}
      binder=android.os.binderpr...@43385cd8
      requested=true received=true hasBound=true doRebind=false

      * Client AppBindRecord{4329e058 ProcessRecord{433869d8 75:system/
1000}}

        Per-process Connections:
          ConnectionRecord{43294410
com.android.inputmethod.latin/.LatinIME:@43338040}

    All Connections:
      ConnectionRecord{43294410
com.android.inputmethod.latin/.LatinIME:@43338040}

  Connection bindings to services:

  * ConnectionRecord{434f2020
com.android.phone/.BluetoothHeadsetService:@434f1dd0}
    binding=AppBindRecord{434f1f50
com.android.phone/.BluetoothHeadsetService:com.android.phone}
    activity=HistoryRecord{43408018 com.android.phone/.InCallScreen}
    conn=android.os.binderpr...@434f1dd0 flags=0x0

  * ConnectionRecord{43294410
com.android.inputmethod.latin/.LatinIME:@43338040}
    binding=AppBindRecord{4329e058
com.android.inputmethod.latin/.LatinIME:system}
    conn=android.app.ActivityThread$PackageInfo$ServiceDispatcher
$innerconnect...@43338040 flags=0x1

  * ConnectionRecord{433e7338
com.google.android.googleapps/.GoogleLoginService:@433e2100}
    binding=AppBindRecord{43430918
com.google.android.googleapps/.GoogleLoginService:com.google.process.gapps}
    conn=android.os.binderpr...@433e2100 flags=0x1

  * ConnectionRecord{433b9908
com.google.android.googleapps/.GoogleLoginService:@433b9878}
    binding=AppBindRecord{43430918
com.google.android.googleapps/.GoogleLoginService:com.google.process.gapps}
    conn=android.os.binderpr...@433b9878 flags=0x1

  * ConnectionRecord{43398190
com.google.android.googleapps/.GoogleLoginService:@433a3768}
    binding=AppBindRecord{43430918
com.google.android.googleapps/.GoogleLoginService:com.google.process.gapps}
    conn=android.os.binderpr...@433a3768 flags=0x1

If we run the same command 2 hours later it returns for our service:

DUMP OF SERVICE activity.services:
Services in Current Activity Manager State:
  Active services:
  * ServiceRecord{43563d78 xx.worldwidyyetime/.widget.RefreshService}
    intent={cmp=xx.yy/.widget.RefreshService}
    packageName=xx.yy
    processName=xx.yy
    baseDir=/data/app/xx.yy.apk/data/app/xx.yy.apk dataDir=/data/data/
xx.yy
    app=ProcessRecord{4348d8f8 1349:xx.yy/10031}
    isForeground=false lastActivity=-5474190
    startRequested=true startId=1 executeNesting=0
executingStart=-5474190 crashCount=0
    totalRestartCount=1 restartCount=1 restartDelay=5000
restartTime=-5474190 nextRestartTime=-5474352

What could be the problem ?

Thanks for you help.















> > > > > > > 

3. I don't see how to do this....

4. A log collector - Bug collector per android developers

5. SAXParser invalid token exception because of '&' inside attribute value

6. Question about emulator and accented character input

7. Interface fo wi-fi