Android Home Screen Widget with SDK version 11 or above Only - android

I am working with the application minimum sdk version 3. I want the app to support Home Screen widget with OS 3.0(sdk - 11) or above only. i.e. User with OS 3.0 or above only should be displayed in widget. How to do the same ?
I already asked one more question let me know if its possible too.
How to get Number of records displayed in RemoteView

Solution 1:
Publish 2 APKs:
One with android:minSdkVersion="11" in your manifest and with your widget implementation
The other one with android:minSdkVersion="3"in your manifest and no widget implementation
Solution 2:
Keep minSdk 3 (android:minSdkVersion="3") and check the SDK version in both methods onUpdate and onReceive of the class that extends AppWidgetProvider. Do the job only if Build.VERSION.SKD_INT >= 11.
In the same way, if you have a App Widget Configuration Activity, do the following in onCreate():
if (Build.VERSION.SDK_INT < 11) {
setResult(RESULT_CANCELED);
Toast.makeText(this, getString(R.string.widget_error_cannot_be_installed), Toast.LENGTH_LONG).show();
finish();
}
Just keep in mind that users with OS<3.0 will see the widget in their widget gallery but will not be able to add it. So you might show a Toast something like "Your Android OS version is too low to add widget".
Let us know if you find any other solution.
Thanks

I am facing same type of issue.
Solution:
if android os version 2.2 or lower then make static list of your data.
else you have to implement listview and set all contain.
If you find any trouble then let me know.

1) You can check OS version with Build.VERSION.SDK_INT, compare it to version codes defined in Build.VERSION_CODES.
2) Keep in mind that on OSes before 2.0 (If i remember it correctly) ClassLoaders are very angry about any 'not supported' classes or methods mentioned in any methods of a loaded class, even if you never actually call these methods. So be sure you don't import anything not available on 1.5 in classes that will be used in 1.5 .

Related

Does every Android device contains all previous SDK versions?

I'm just wondering, if the latest Android SDK installed on a device contains code of all the previous versions as well?
So if I target API level 10 in my app and install it on a device with Lollipop, will it just take and use Gingerbread SDK exactly as it was 3 years ago?
Or is there just one codebase for all versions with a lot of checks and switches which is then run by some kind of compatibility mode picking the correct code and enabling methods of the version of SDK I target?
I read the article about android:targetSdkVersion specified in Manifest but still would like to know how this works internally.
Ok, I just surfed a bit around on the source code (which you can find here: https://github.com/android/platform_frameworks_base). I'm not an engineer of the Android framework, I was just curious about your question and here is what I found.
It does not contain all the different versions of source code. You can imagine that this would result in a nightmare if more and more versions become available. Foremost, you would have different (buggy) versions of the same method without fixing them just to keep them the same.
In the source code, you can find places like these: (see https://github.com/android/platform_frameworks_base/blob/59701b9ba5c453e327bc0e6873a9f6ff87a10391/core/java/com/android/internal/view/ActionBarPolicy.java#L55)
public boolean hasEmbeddedTabs() {
final int targetSdk = mContext.getApplicationInfo().targetSdkVersion;
if (targetSdk >= Build.VERSION_CODES.JELLY_BEAN) {
return mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs);
}
// ...
return mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs_pre_jb);
}
So the Android developers do the version check in the code where necessary. But these checks are not as necessary as you think (I guess). What's the reason for changing a method?
method is buggy: All they need to do is fix the bug. Tests will make sure that the general behavior of the method keeps the same
method is deprecated: The guys can not remove the method, all they can do is mark it as deprecated and hope for the best. Compilers will do the rest.
method behavior has to change: Well, I guess that is something they can not do easily. They can work around with version codes (which is pretty ugly and becomes a maintenance nightmare), or they just introduce a new API. That's the reason why you'll find a lot of APIs just doing the same
If you have write down a code with latest android sdk and install it in your device. It means actually you are using latest android.jar(you can see android.jar in your project) file while compiling/Executing code.
Now If you install your application in ginger bread device then android.jar(latest) has a backward compatibility(if required) to run code in Gingerbread device.and if you define target sdk version 10 and running app on Higher API level ,then it will run smooth except your compatibility behavior disable in respective device other than targeted devices.

Android- bottom bar tab

Need to create an application in a below mentioned link format targeting all the android platform i.e. from 1.5 to 4.1
http://natieklopper.blogspot.in/2011/08/iphone-styled-bottom-aligned-tab-bar.html
Can I use tab activity class for the same? Know it is deprecated but still need to confirm if we use then will my application work on all android devices.
Not getting appropriate demo or example to start my application with fragments,action bar sherlock's tab.
Please suggest me a simple way to initiate my application. Really appreciate if some examples are available.
Your application will work in all android devices if they have a newer version than 1.5
Deprecated means obsolete, but you can continue using ;)

Setting Min SDK Version causes app to function improperly: running out of memory

I was getting ready to publish an app, but when I set the min SDK version to anything higher than 3, parts of my app stop working. Specifically I have buttons that launch a new activity, each with different parameters, but only one of them launches the activity if the Min SDK is set (to something other than 1). What am I doing wrong here? I don't think I'm missing any permissions, as the app is relatively simple.
Edit: I was looking at LogCat, and I realized that there seems to be an out of memory issue. Each of the buttons that launches the new activity tells it to load a certain set of images to be displayed, the one button that still functions loads less images. Is there any way to make the app function again without making the images lower quality? Also, why does changing the min SDK version affect this?
The first thing, always, to do is to look at what is being printed in logcat. Very likely there will be error messages there telling you what is going on.
This is a rough documentation on how the various min (actually target) SDK levels modify how the platform behaves for your app: http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
Unfortunately there are probably a few things missing from it, but most of the major differences of interest are there.

Selective AppWidgets

I have a app which has 2 widgets, lets call them SimpleWidget and ListWidget.
ListWidget makes use of android 3.1 (api level 12) features.
What I would like to do is register both widgets if the device is 3.1 or above.
If it is not than I would only want to register SimpleWidget.
As the code stands now the widgets are defined in my app's AndroidManifest.xml file.
I can't figure out how I could filter this by sdk level.
The only solution I have found so far would still display both widgets (in android's add widget page) even on pre 3.1 devices (in which case I relegate ListWidget to a SimpleWidget).
Am I missing something?
For example can I register widgets in Java code (maybe in the app's onCreate method) instead of in the manifest file? (seems unlikely since the info is needed before the app is ever run).

Android compatibilty settings in AndroidManifest.xml

I have an app to release which works on all android screen-sizes (except smaller) and densities above SDK version 2.0.
It will also run on extra large screens.
Currently I have added this:
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="false"
android:anyDensity="true"
/>
But I also need to add android:xlargeScreens="true" , to allow it visible in android market on extra large screen devices, since by default it is false.
But to add android:xlargeScreens I need to change my eclipse targetsettings to 2.3 as this attribute was added from API level 9.
So what should I do with my target compilation settings for this scenario ? Should it be 2.3 while compiling ? If yes, then will the app not give any problems while running on devices with 2.0 version ?
Yes you need to change the uses sdk to 2.3 but make sure that you are not using any newer apis which are not in 2.0 or whatever your minimum supported sdk version is. Or in case you want to use them you have to use reflection.
But more about how to use the sdk versions is here and more about uses-sdk is here.
I do the same in my application and make sure you test your application in both[all] the versions before you release.
Best,
Achie.
I'm moving this from the comments to make it more clear for others looking at this question in the future.
When supporting both old and new versions of Android it can be confusing how applications manage to run despite many things change with in the frameworks during each new release, I'm going to try and clarify this here.
An application written for the 1.5 sdk can only call functions that exist for that API level, so for instance the multi touch api's didn't exist in 1.5 and never will. Now you say "Ok but I don't need to call any newer APIs, I just want my app to work in 2.3 and have a2sd support" And I say "Ok, just change your targetApi in the manifest, set the minSDK and compile against 2.3 and you're good to go."
Now why does that work? What if the onMeasure() method for ListView was changed in 2.2 and now calls betterCalculateFunction() within onMeasure()? Why does my app still work?
This is the advantage of late binding in Java. You see, Java is never compiled until it reaches a device and is running, what you are doing in Eclipse is converting it to byte code which contains a bunch of byte code instructions that are later interpreted by the device. The byte code will NEVER contain a reference to betterCalculateFunction() though (unless you directly call it. Calling onMeasure() is indirect). This can happen because when your code is running on the device it gets linked against the Android framework on the device and your code calls onMeasure() directly because it is a public outward facing API. The path of execution will then enter the framework and call whatever it needs to, then once its done return to your code.
So on 1.5 you might see
doStuff (your code) -> onMeasure
(public API) -> done
and 2.2
doStuff (your code) -> onMeasure
(public API) ->
betterCalculateFunction (private
function) ->done
Now if you need to call functions that may or may not exist depending on API level then I suggest you look at a related answer of mine here stackoverflow: gracefully downgrade your app
Hope that clears some things up.
I haven't tried 2.3, but that's what I do with 2.2.
I compile for 2.2 and test on 1.6 to make sure everything works how I'm expecting. I haven't run in to any issues with it.
To double check, set your target for 2.3 and then setup an emulator for a lower rev version to make sure it all works.
The default value for android:xlargeScreens is true, so you don't have to change anything - it's on by default, as long as your minSdkVersion or targetSdkVersion is higher than 4.
http://developer.android.com/guide/topics/manifest/supports-screens-element.html
Here is an official Android developer blog explanation of how this works:
http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html
In summary: you can use the newest XML whilst still supporting the older OS versions in a back compatible way.
While reading this blog post I guess I have an answer on my old question. An extract below (which is for another manifest attribute "requiresSmallestWidthDp" introduced from 3.2):
"The catch is that you must compile your application against Android 3.2 or higher in order to use the requiresSmallestWidthDp attribute. Older versions don’t understand this attribute and will raise a compile-time error. The safest thing to do is develop your app against the platform that matches the API level you’ve set for minSdkVersion. When you’re making final preparations to build your release candidate, change the build target to Android 3.2 and add the requiresSmallestWidthDp attribute. Android versions older than 3.2 simply ignore that XML attribute, so there’s no risk of a runtime failure."
For different screens you have to create multiple apk then it reduces size of your application.In each application's manifest you have to define according to following link.
http://developer.android.com/guide/practices/screens-distribution.html

Categories

Resources