Now I don't have time to maintain this library. By using Kotlin (especially delegated property), we can put and get intent extra as type safe way without this libary.
Grenade is annotation based intent builder for activities and services. By using this library, you can build Intent with extras and retrieve extras by type safe way and less code.
This library is strongly inspired by emilsjolander/IntentBuilder but some advanced features are added.
Project build.gradle
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}App build.gradle
dependencies {
...
annotationProcessor 'com.github.kobakei.grenade:processor:LATEST_VERSION'
compile 'com.github.kobakei.grenade:library:LATEST_VERSION'
}NOTE: if you use Android Gradle Plugin before 2.2.0, you must use android-apt plugin instead of annotationProcessor configuration.
Add @Navigator annotation to activity and @Extra annotation to fields.
@Navigator
public class DetailActivity extends AppCompatActivity {
// Required params
@Extra
String foo;
@Extra
int bar;
// Optional params
@Extra @Optional
String hoge;
@Extra @Optional
boolean fuga;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}Once you build, DetailActivityNavigator will be generated. Building intent to launch DetailActivity is as below.
// Build intent and start activity
startActivity(new DetailActivityNavigator(foo, bar)
.hoge(hoge)
.fuga(fuga)
.flags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
.build(context);And handling intent is as below.
@Navigator
public class DetailActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Inject fields
DetailActivityNavigator.inject(this, getIntent());
}
}Of course, you can use Grenade to start Service and BroadcastReceiver as same way.
@Navigator
public class MyIntentService extends IntentService{
@Extra
String foo;
@Extra
String baz;
@Override
protected void onHandleIntent(Intent intent) {
MyIntentServiceNavigator.inject(this, intent);
}
}
// Code to start service
startService(new MyIntentServiceNavigator("foo", "baz").build(this));By specifying fields in @Navigator annotation, multiple constructors with different set of required params will be generated.
@Navigator({
"foo,bar1",
"foo,bar2"
})
public class DetailActivity extends AppCompatActivity {
@Extra
String foo;
@Extra
int bar1;
@Extra
long bar2;
...
}You can use them as below.
startActivity(new DetailActivityNavigator(foo, bar1)
.build(context));
startActivity(new DetailActivityNavigator(foo, bar2)
.build(context));Setting Intent object to onActivityResult has the same problem as above.
Grenade offers APIs to build Intent to pass setResult and to handle onActivityResult as type safe way.
As an example, let's think about handling DetailActivity's result in MasterActivity.
At first, in MasterActivity, add method to handle result of DetailActivity with @OnActivityResult annotation. Moreover, call MasterActivityNavigator.onActivityResult in onActivityResult.
@OnActivityResult(requestCode = REQ_CODE_DETAIL1, resultCodes = {Activity.RESULT_OK})
void onDetailOk(String foo, int bar) {
Toast.makeText(this, "Detail OK", Toast.LENGTH_SHORT).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
MainActivityNavigator.onActivityResult(this, requestCode, resultCode, data);
}In DetailActivity, setting result is as below:
setResult(RESULT_OK, MainActivityNavigator.resultForOnDetailOk("Hello", 123));
finish();Once you build, putting extras and getting extras will be done in MainActivityNavigator.
Parceler is a famous library to generate Parcelable reader/writer.
Grenade offers build-in support of Parceler.
When field type has @Parcel annotation, Grenade will wrap/unwrap an entity with Parceler.
To install Parceler to your project, please read Parceler's README.
// Entity class with @Parcel annotation
@Parcel
public class User {
...
}@Navigator
public class DetailActivity extends AppCompatActivity {
// Use parcelable entity as field
@Extra
User user;
...
}startActivity(new DetailActivityNavigator(new User())
.build(context));If you use Grenade with Parceler, ProGuard setting of Parceler is needed.
Copyright 2016 Keisuke Kobayashi
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.