From
http://www.vogella.com/tutorials/AndroidLibraryProjects/article.html
Table of Contents
Android project can use code contained in JAR
files (Java libraries). It is also possible to create libraries modules which can be used as dependencies in Android projects. These modules allow you to store source code and Android resources which can be shared between several other Android projects.
To use a Java library (JAR file) inside your Android project, you can simple copy the JAR
file into the folder called libs
in your application. Depending on your IDE this automatically makes your JAR available or your have to do an additional step.
In Android Studio you have to
-
Right-click the JAR file in the libs folder and select
. -
Check that you have a new entry
compile files('libs/YOURJAR.jar'
in yourbuild.gradle
file. -
To ensure that the change is picked up, perform a clean build.
If you want to use libraries, these must only use API available in Android. For example, the Android libraries do not contain the java.awt
and javax.swing
user interface libraries, as Android has its own user interface toolkit.
Library projects cannot be compiled to Android applications and started without another project using them.
Using library projects helps you to structure your application code. Also more and more important Open Source libraries are available for Android. Understanding library projects is therefore important for every Android programmer.
If an Android application project uses an Android library module, the Android development tools include the code and resources from the library project into the build result of the Android project. This means, that the components, code and resources of the library project are compiled and packaged into the.apk
file of the compiled application.
Therefore a library module can be considered to be a compile-time artifact. An Android library module can contain Java classes, Android components and resources. Only assets are not supported.
To create a library project, set the Mark this project as library flag in the Android project generation wizard.
The library project must declare all its components, e.g., activities, service, etc. via theAndroidManifest.xml
file. The application which uses the library must also declare all the used components via the AndroidManifest.xml
file.
The Android development tools merges the resources of a library project with the resources of the application project. In the case that a resource's ID is defined several times, the tools select the resource from the application, or the library with highest priority, and discard the other resource.
The Android team introduced a new binary distribution format called Android ARchive(AAR). The .aar
bundle is the binary distribution of an Android Library Project.
An AAR is similar to a JAR file, but it can contain resources as well as compiled byte-code. This allows that an AAR file is included in the build process of an Android application similar to a JAR
file
The following example assumes that you have created a normal Android project calledcom.example.android.rssfeed based on the Android Fragments tutorial.
Our library project will not contribute Android components but a data model and a method to get the number of instances. The library provides access to (fake) RSS data. An RSS document is an XML file which can be used to publish blog entries and news. The format of the XML file is specified via the RSS specification.
Our library project will not contribute Android components but a data model and a method to get the number of instances. We will provide RSS-feed data. The following gives a short introduction into RSS.
An RSS document is an XML file which can be used to publish blog entries and news. The format of the XML file is specified via the RSS specification.
RSS stands for Really Simple Syndication (in version 2.0 of the RSS specification).
Typically a RSS file is provided by a web server, which RSS client read. These RSS clients parse the file and display it.
For Android Studio each library is a module. To create a new library module in Android Studio, selectAndroid Library.
→ and select
Use com.example.android.rssfeedlibrary as module name and Rssfeed Library as library name.
If prompted for a template select that no activity should be created.
As a result Android Studio shows another module.
Create an RssItem
class which can store data of an RSS entry.
Generate the getters and setter, the constructor and a toString()
method. The result should look like the following class:
package com.example.android.rssfeedlibrary; public class RssItem { private String pubDate; private String description; private String link; private String title; public RssItem() { } public RssItem(String title, String link) { this.title = title; this.link = link; } public String getPubDate() { return pubDate; } public void setPubDate(String pubDate) { this.pubDate = pubDate; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "RssItem [title=" + title + "]"; } }
Create a new class called RssFeedProvider
with a static method to return a list of RssItem
objects. This method does currently only return test data.
package com.vogella.android.rssfeedlibrary; import java.util.ArrayList; import java.util.List; import java.util.Random; public class RssFeedProvider { public static List<RssItem> parse(String rssFeed) { List<RssItem> list = new ArrayList<>(); Random r = new Random(); // random number of item but at least 5 Integer number = r.nextInt(10) + 5; for (int i = 0; i < number; i++) { // create sample data String s = String.valueOf(r.nextInt(1000)); RssItem item = new RssItem("Summary " + s, "Description " + s); list.add(item); } return list; } }
To use the library add it as a dependency in your project select appentry. Switch to the Dependencies tab and select Module dependencies via the + sign.
→ . Select the
Use the static method of RssFeedProvider
to get the list of RssItem
objects and display the number in your DetailFragment
instead of current system time.
To send the new data, change the updateDetail
method in your MyListFragment
class.
package com.example.android.rssreader; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import com.example.android.rssfeedlibrary.RssFeedProvider; import com.example.android.rssfeedlibrary.RssItem; import java.util.List; public class MyListFragment extends Fragment { private OnItemSelectedListener listener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_rsslist_overview, container, false); Button button = (Button) view.findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { updateDetail("fake"); } }); return view; } public interface OnItemSelectedListener { public void onRssItemSelected(String link); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnItemSelectedListener) { listener = (OnItemSelectedListener) context; } else { throw new ClassCastException(context.toString() + " must implement MyListFragment.OnItemSelectedListener"); } } // triggers update of the details fragment public void updateDetail(String uri) { List<RssItem> list = RssFeedProvider .parse("http://www.vogella.com/article.rss"); String text = String.valueOf(list.toString()); listener.onRssItemSelected(text); } }