Coder Social home page Coder Social logo

jiezhuang88 / androiddynamicloader Goto Github PK

View Code? Open in Web Editor NEW

This project forked from mmin18/androiddynamicloader

0.0 1.0 0.0 3.93 MB

A plugin system that runs like a browser, but instead of load web pages, it load plugins which runs natively on Android system.

License: Other

androiddynamicloader's Introduction

Android Dynamic Loader

Android Dynamic Loader is a plugin system. The host application is like a browser, but instead of load web pages, it load plugins which runs natively on Android system.

You can download the demo from https://github.com/mmin18/AndroidDynamicLoader/raw/master/host.apk (35k).

HelloWorldDemo

BitmapFunDemo

How to run the sample plugins

The sample plugins is under workspace folder, but do not try to run them directly, it won't start.

First you need to install host.apk on your phone (or you can build the Host project yourself)

Also you need to make sure the Android SDK and Ant is installed and android-sdk/tools, android-sdk/platform-tools, ant is in your PATH.

Run the following commands:

chmod +x tools/update.sh
tools/update.sh workspace
cd workspace
ant run

If it shows "device not found", make sure your phone is connected or simulator is running. "adb devices" will tell.

Since we don't specific a default entry in workspace.properties, it will popup a window and let you choose one. I suggest bitmapfun.

About UI Container

In a normal Android application, we use Activity as the root UI container. But since Activity is registered in AndroidManifest.xml, and we can't modify manifest in runtime, we must find an alternative UI container - Fragment.

The Fragment itself, interduced in Android 3.0 Honeycomb, is a perfect UI container, and it has lifecycle and state management.

Once the plugin and its dependency is downloaded, an Activity (MainActivity.java) will be started, create an instance of the specific fragment, and add the fragment into the root view.

See the HelloFragment.java sample.

About URL Mapping

Since we use Fragment as UI container, each page is implemented in Fragment instead of Activity. So how do we start a new page?

We use URL, just like a browser does. For instance, in a browser, we open http://mydomain.com/helloworld.html. In plugins, we open app://helloworld.

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("app://helloworld"));
startActivity(i);

Each host is mapped to a single fragment, you define the url mapping table in project/fragment.properties.

See the helloworld fragment.properties sample.

About Resources

In the plugins, we pack resources and codes in the same package. We use R.java as the index of resources.

But instead of using context.getResources(), we use MyResources.getResource(Me.class) to get the resources which in the same package as Me.class.

Here is a sample in HelloFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
		Bundle savedInstanceState) {

	// MyResources manages the resources in specific package.
	// Using a Class object to obtain an instance of MyResources.

	// In this case, hello.xml is in the same package as HelloFragment class

	MyResources res = MyResources.getResource(HelloFragment.class);

	// Using MyResources.inflate() if you want to inflate some layout in
	// this package.
	return res.inflate(getActivity(), R.layout.hello, container, false);

}

You can use MyResources to get drawable, string, or inflate layout.

Folders

/Host contains the host application (build as host.apk).

/tools/update.sh checks your environment and helps you config your plugins. You should always run it once after git clone or create a new plugin.

/workspace/sample.helloworld is a most simple plugin. /workspace/sample.helloworld/fragment.properties defines the url mapping of your fragments.

/site/***/site.txt is the definition file for all the plugins files, dependency and fragments url mapping table.

androiddynamicloader's People

Contributors

mmin18 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.